Python之set集合详解
定义
set(集合)是Python中常见的一种数据类型。集合中的元素是无序和唯一的,它主要用于进行关系测试和消除重复元素。集合对象还支持union(联合),intersection(交集),difference(差集),sysmmetric difference(对称差集)等数学运算。
创建集合set
创建空集合
s = set() # 空集合
print(type(s)) # <class 'set'>
s1 = {} # 空字典
print(type(s1)) # <class 'dict'>
注意:想要创建空集合,你必须使用set()而不是{},后者用于创建空字典。
创建非空集合
s1 = {1, 2, 3}
print(s1)
s2 = set('HelloWorld')
print(s2)
结果如下
{1, 2, 3}
{'l', 'o', 'W', 'H', 'r', 'd', 'e'}
常用的集合方法
s.add() - 向集合中添加元素
s = {'a', 'b', 'c'}
s.add(666)
print(s) # {'b', 666, 'c', 'a'}
s.remove() - 删除集合中的元素
s = {'a', 'b', 'c'}
s.remove('a')
print(s) # {'b', 'c'}
s.remove('d') # 删除集合中不存在的元素会报KeyError错误
s.pop() - 删除并返回任意的集合元素(随机删除)
s = {'a', 'b', 'c'}
s.pop() # 删除时无序的随机删除
print(s) # {'a', 'b'}
s.discard() - 删除集合中的元素
s = {'a', 'b', 'c'}
s.discard('a')
s.discard('d') # 如果元素不存在则不执行任何操作
print(s) # {'c', 'b'}
s.clear() - 清空集合
s = {'a', 'b', 'c'}
s.clear()
print(s) # set()
s.copy() - 浅拷贝一个集合
s1 = {'a', 'b', 'c'} # 可变集合
s2 = frozenset(s1) # 不可变集合
s1_cp = s1.copy()
s2_cp = s2.copy()
print(s1, s1_cp, id(s1), id(s1_cp))
print(s2, s2_cp, id(s2), id(s2_cp))
结果如下
{'c', 'a', 'b'} {'c', 'a', 'b'} 2553599288040 2553852385768
frozenset({'c', 'a', 'b'}) frozenset({'c', 'a', 'b'}) 2553597533768 2553597533768
在python中,set属于可变类型,fronzenset则属于不可变类型。
可变对象的浅拷贝,整体地址不一样,但是内部元素都是同一个地址(你可以尝试遍历集合中的元素来查看元素的地址);
而不可变对象的浅拷贝,整体地址和内部元素都是同一个地址。
s1.issubset(s2) - 子集
子集,为某个集合中一部分的集合,故亦称部分集合。
使用操作符 <
执行子集操作,同样地,也可使用方法 issubset() 完成。
s1 = {'a', 'b'}
s2 = {'a', 'b', 'c', 'd'}
s3 = {'a', 'c'}
print(s1.issubset(s2)) # True
print(s1 < s2) # True
print(s1 < s3) # False
s1.intersection(s2) - 交集
两个集合 A 和 B 的交集是含有所有既属于 A 又属于 B 的元素,而没有其他元素的集合。
使用 &
操作符执行交集操作,同样地,也可使用方法 intersection() 完成。
s1 = {'a', 'b', 'c'}
s2 = {'a', 'b', 'd'}
s3 = s1.intersection(s2)
s4 = s1 & s2 # 效果同上
print(s3) # {'b', 'a'}
print(s4) # {'b', 'a'}
s1.union(s2) - 并集
一组集合的并集是这些集合的所有元素构成的集合,而不包含其他元素。
使用操作符 |
执行并集操作,同样地,也可使用方法 union() 完成。
s1 = {'a', 'b', 'c'}
s2 = {'a', 'b', 'd'}
s3 = s1.union(s2)
s4 = s1 | s2 # 效果同上
print(s3) # {'a', 'b', 'd', 'c'}
print(s4) # {'a', 'b', 'd', 'c'}
s1.difference(s2) - 差集
A 与 B 的差集是所有属于 A 且不属于 B 的元素构成的集合。
使用操作符 -
执行差集操作,同样地,也可使用方法 difference() 完成。
s1 = {'a', 'b', 'c'}
s2 = {'a', 'b', 'd'}
s3 = s1.difference(s2)
s4 = s1 - s2 # 效果同上
print(s3) # {'c'}
print(s4) # {'c'}
s1.symmetric_difference(s2) - 对称差
两个集合的对称差是只属于其中一个集合,而不属于另一个集合的元素组成的集合。
使用 ^
操作符执行差集操作,同样地,也可使用方法 symmetric_difference() 完成。
s1 = {'a', 'b', 'c', 'd'}
s2 = {'a', 'b', 'e', 'f'}
s3 = s1.symmetric_difference(s2)
s4 = s1 ^ s2
print(s3) # {'c', 'e', 'f', 'd'}
print(s4) # {'c', 'e', 'f', 'd'}
s.update() - 更新集合
s = {'a', 'b', 'c'}
s.update('d')
print(s) # {'b', 'a', 'c', 'd'}
s.update({'e', 'f'})
print(s) # {'a', 'f', 'd', 'e', 'b', 'c'}
s.update(['g', 'h'])
print(s) # {'h', 'a', 'f', 'd', 'e', 'g', 'b', 'c'}