集合是python中无序可变序列,使用一对大括号作为定界符,元素之间用逗号分隔,同一个集合内的每一个元素都是唯一的,元素之间不允许重复
凡无法计算哈希值(调用内置函数hash()时抛出异常)的对象都不能作为集合的元素
集合对象的创建和删除
直接赋值给变量即可创建一个集合对象
a = {3,5} #创建集合对象
type(a) #查看对象类型
当然我们也可以把列表,元组,字符串,range对象等其它可迭代对象转换为集合,如果原来的数据中存在重复元素,则在转换为集合的时候只保留一个,如果原序列或迭代对象有不可哈希的值,无法转换为集合,抛出异常
a_set = set(range(8,14)) #把range对象转换为集合
我们也可以使用集合推导式快速生成集合,而当我们不再使用某个集合时,可以使用del命令删除整个集合
集合元素的增删及运算
- add()
可以增加新元素,如果该元素存在则忽略该操作,不抛出异常 - update()
合并另一个集合中的元素到当前集合中,并自动去除重复的元素
s = {1,2,3}
s.add(3) #添加元素,重复元素自动忽略
s.update({3,4}) #更新当前字典,自动忽略重复元素
#输出{1,2,3,4}
- pop()
随机删除并返回集合中的一个元素,如果集合为空,则抛出异常 - remove()
删除集合中的元素,如果指定元素不存在则抛出异常 - discard()
删除集合中一个特定元素,元素不存在则忽略该操作 - clear()
清空集合
s.discard(5) #删除元素,不存在忽略操作
s.remove(5) #删除元素,不存在抛出异常
#输出为keyError: 5
s.pop() #删除并返回一个元素
#输出为1
内置函数len(), max(), min(), sum(), sorted(), map(), filter(), enumerate()等也适用于集合,同时也支持数学意义上的交集,并集,差集等运算
e.g.
a_set = set([8,9,10,11,12,13])
b_set = set([0,1,2,3,,7,8])
a_set | b_set #并集
a_set.union(b_set) #并集
a_set & b_set #交集
a_set.intersection(b_set) #交集
a_set.difference(b_set) #差集
a_set-b_set
a_set.symmetric_difference(b_set) #对称差集
a_set^b_set
当然关系运算符> >= < <= 作用于集合时表示集合之间的包含关系,而不是比较集合中元素的大小关系
x = {1,2,3}
y = {1,2,5}
z = {1,2,3,4}
x < y #输出False 比较集合大小/包含关系
x < z #真子集,输出True
{1,2,3} <= {1,2,3} #子集,输出True
x.issubset(y) #测试是否为子集,输出False
{3}.isdisjoint({4}) #如果两个集合的交集为空,返回True
不可变集合frozenset
用法与set类似,支持交集,并集,差集等运算以及测试是否为子集或超集等运算
没有修改集合对象的方法
x = frozenset(range(5)) #创建不可变集合
x.add(5) #不支持add()方法,抛出异常
x | frozenset(range(5,10)) #并集运算
x & frozenset(range(5,10)) #交集运算
x - frozenset(range(5,10)) #差集运算
frozenset(range(4)) < frozenset(range(5)) #集合包含关系比较,返回True`在这里插入代码片`