数学概念中的集合定义:
它是集合论的研究对象,指具有某种特定性质的事物的总体,(在最原始的集合论─朴素集合论─中的定义,集合就是“一堆东西”。)集合里的事物(“东西”),叫作元素。若然 x 是集合 A 的元素,记作 x ∈ A。
在 Python 中集合特征:
无序唯一,可以原地修改,或者说是可变的,也可以说是 unhashable(不可哈希)的。
创建集合:
在 Python 中,集合由内置的 set 类型定义。
要创建集合,需要将所有项(元素)放在花括号({})内,以逗号(,)分隔。
创建空集合:利用set() ,不可以用set{},这种的类型为字典不是集合
例子:
s = {'1','2','python'}
s = set()
集合可以有任意数量的元素,它们可以是不同的类型(例如:数字、元组、字符串等)。但是,集合不能有可变元素(例如:列表、集合或字典)。
s = {1,2,3} # 整形的集合, 打印结果{1, 2, 3}
s = {1.5,'aaa',(1,2,3)} # 混合类型的集合 ,打印结果{1.5, (1, 2, 3), 'aaa'} 打印的结果是无序的
s = set(['aaa','bbb',1]) #从列表创建集合,注意要有set()开头,否则是list, 打印结果{'bbb', 'aaa', 1}
不能有可变元素在其中
集合在数学中的特性:(参考一去丶二三里http://blog.youkuaiyun.com/liang19890820)
无序性:一个集合中,每个元素的地位都是相同的,元素之间是无序的。
集合上可以定义序关系,定义了序关系后,元素之间就可以按照序关系排序。但就集合本身的特性而言,元素之间没有必然的序。
互异性:一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次。
有时需要对同一元素出现多次的情形进行刻画,可以使用多重集,其中的元素允许出现多次。
确定性:给定一个集合,任给一个元素,该元素或者属于或者不属于该集合,二者必居其一,不允许有模棱两可的情况出现。
对应的python的无序\互异\确定性:
无序性&互异性:s = set('hello') #打印结果{'l', 'e', 'h', 'o'}
由于集合是无序的,所以索引没有任何意义。也就是说,无法使用索引或切片访问或更改集合元素。
确定性:
s = set('hello')
print('l' in s) #打印结果 True
print('i' not in s) #打印结果 True
集合运算:
首先准备3个集合:
A = set('abcd')
B = set('cdef')
C = set('ab')
子集: '<' 或者issubset()方法
print(C<A) #打印结果True
print(C.issubset(A)) #打印结果True
并集: ' | ' 或者 union() 方法
print(A | B)
print(A.union(B)) #打印结果{'f', 'b', 'c', 'e', 'd', 'a'} 上同
交集: ' & ' 或者 intersection() 方法
print(A & B) #打印结果 {'c', 'd'}
print(A.intersection(B)) #打印结果 {'c', 'd'}
差集: ' - '或者 difference() 方法
print(A - B) #打印结果 {'b', 'a'}
print(A.difference(B)) #打印结果 {'b', 'a'}
print(B.difference(A)) #打印结果 {'e', 'f'}
对称差: ' ^ ' 或者symmetric_difference() 方法
print(A ^ B) #打印结果{'f', 'b', 'a', 'e'}
print(A.symmetric_difference(B)) #打印结果{'f', 'b', 'a', 'e'}
print(B.symmetric_difference(A)) #打印结果{'f', 'b', 'a', 'e'}
增加:
虽然集合不能有可变元素,但是集合本身是可变的。也就是说,可以添加或删除其中的元素。可以使用 add() 方法添加单个元素,使用 update() 方法添加多个元素,update() 可以使用元组、列表、字符串或其他集合作为参数。在所有情况下,元素都不会重复。
A.add('t')
print(A) #打印结果 {'d', 'c', 't', 'b', 'a'}
A.update([1,2,3])
print(A) #打印结果 {1, 'b', 'd', 2, 3, 'a', 'c'}
A.update((4,5,6))
print(A) #打印结果 {'a', 1, 2, 3, 4, 5, 6, 'c', 'd', 'b'}
从集合中删除元素
可以使用 discard() 和 remove() 方法删除集合中特定的元素。
两者之间唯一的区别在于:如果集合中不存在指定的元素,使用 discard() 保持不变;但在这种情况下,remove() 会引发 KeyError。
s = {'p','y','t','h','o','n'}
print(s) #打印结果 {'t', 'o', 'n', 'p', 'h', 'y'}
st = s.discard('t')
print(s) #去掉一个存在元素't' , 打印结果 {'o', 'n', 'p', 'h', 'y'}
sp = s.remove('p')
print(s) #去掉一个存在元素'p', 打印结果 {'o', 'n', 'h', 'y'}
sw = s.discard('w')
print(s) #去掉一个不存在元素'w', 打印结果 {'o', 'n', 'h', 'y'} 无异常
sw0 = s.remove('w')
print(s) #删除集合里没有的w元素,remove报错
类似地,可以使用 pop() 方法删除和返回一个项目。还可以使用 clear() 删除集合中的所有元素。
s = set('python')
print(s.pop()) #随机pop一个字母,可能是python中的任何一个元素,每次值不同
print(s.clear()) #打印结果None,清空了所有元素
拷贝一个集合: 浅拷贝,只拷贝值
s = set('python')
print(s.copy()) #打印结果 {'h', 'o', 't', 'p', 'y', 'n'}
s = set('python')
print(max(s)) #打印结果,最大值为 y
print(min(s)) #打印结果,最小值为 h
print(len(s)) #打印结果,s的长度为 6
print(sorted(s)) #从集合中的元素返回新的排序列表 ['h', 'n', 'o', 'p', 't', 'y']
如果要查看集合的所有方法:dir(s)
['__and__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__iand__', '__init__', '__init_subclass__', '__ior__', '__isub__', '__iter__', '__ixor__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__or__', '__rand__', '__reduce__', '__reduce_ex__', '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__xor__', 'add', 'clear', 'copy', 'difference', 'difference_update', 'discard', 'intersection', 'intersection_update', 'isdisjoint', 'issubset', 'issuperset', 'pop', 'remove', 'symmetric_difference', 'symmetric_difference_update', 'union', 'update']
方法 | 描述 |
---|---|
add() | 将元素添加到集合中 |
clear() | 删除集合中的所有元素 |
copy() | 返回集合的浅拷贝 |
difference() | 将两个或多个集合的差集作为一个新集合返回 |
difference_update() | 从这个集合中删除另一个集合的所有元素 |
discard() | 删除集合中的一个元素(如果元素不存在,则不执行任何操作) |
intersection() | 将两个集合的交集作为一个新集合返回 |
intersection_update() | 用自己和另一个的交集来更新这个集合 |
isdisjoint() | 如果两个集合有一个空交集,返回 True |
issubset() | 如果另一个集合包含这个集合,返回 True |
issuperset() | 如果这个集合包含另一个集合,返回 True |
pop() | 删除并返回任意的集合元素(如果集合为空,会引发 KeyError) |
remove() | 删除集合中的一个元素(如果元素不存在,会引发 KeyError) |
symmetric_difference() | 将两个集合的对称差作为一个新集合返回 |
symmetric_difference_update() | 用自己和另一个的对称差来更新这个集合 |
union() | 将集合的并集作为一个新集合返回 |
update() | 用自己和另一个的并集来更新这个集合 |
集合的内置函数:
函数 | 描述 |
---|---|
all() | 如果集合中的所有元素都是 True(或者集合为空),则返回 True。 |
any() | 如果集合中的所有元素都是 True,则返回 True;如果集合为空,则返回 False。 |
enumerate() | 返回一个枚举对象,其中包含了集合中所有元素的索引和值(配对)。 |
len() | 返回集合的长度(元素个数) |
max() | 返回集合中的最大项 |
min() | 返回集合中的最小项 |
sorted() | 从集合中的元素返回新的排序列表(不排序集合本身) |
sum() | 返回集合的所有元素之和 |