集合(set)是一个无序的不重复元素序列。
可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
集合的常用方法
add
add向一个集合添加一个元素,如果元素已经存在,对集合没用任何影响
例1:
s1 = {1, 99, 77, 44, 55}
s1.add(22)
s1.add(99) # 由于99已经存在,顾对集合没有任何改变
print('添加元素后的集合是:', s1)
运行结果:
添加元素后的集合是:{1, 99, 44, 77, 22, 55}
clear
clear用来清空一个集合
例1:
s1 = {1, 99, 77, 44, 55}
s1.clear()
print('清空后的集合是:',s1)
运行结果:
清空后的集合是:set() # 注意空集合的方式是set()
copy
例1:
s1 = {1, 99, 77, 44, 55}
s2 = s1.copy()
print('复制后的集合是:', s2)
运行结果:
复制后的集合是: {1, 99, 55, 44, 77}
difference
difference是返回一个差集,该集合在s1钟,不在s2中
差集也可以用运算符: -
例1:
s1 = {1, 99, 77, 44, 55}
s2 = {33, 44, 55, 66, 7}
ret = s1.difference(s2)
print('只属于s1集合的是:', ret)
print('s1的元素是:', s1)
print('s2的元素是:', s2)
运行结果:
只属于s1集合的是: {1, 99, 77}
s1的元素是: {1, 99, 44, 77, 55}
s2的元素是: {33, 66, 7, 44, 55}
例2:
使用运算符
s1 = {1, 99, 77, 44, 55}
s2 = {33, 44, 55, 66, 7}
ret = s1 - s2
print('只属于s1集合的是:', ret)
print('s1的元素是:', s1)
print('s2的元素是:', s2)
运行结果:
只属于s1集合的是: {1, 99, 77}
s1的元素是: {1, 99, 44, 77, 55}
s2的元素是: {33, 66, 7, 44, 55}
difference_update
difference_update修改一个集合,移除集合s1中,属于集合s2的元素,
该方法与difference的不同之处在于,difference会返回一个新集合,而difference_update是修改原集合
例1:
s1 = {1, 99, 77, 44, 55}
s2 = {33, 44, 55, 66, 7}
s1.difference_update(s2)
print('s1的元素是:', s1)
print('s2的元素是:', s2)
运行结果:
s1的元素是: {1, 99, 77}
s2的元素是: {33, 66, 7, 44, 55}
discard
从一个集合从移除一个元素,如果集合中不存在这个元素,不做任何操作
例1:
s1 = {1, 99, 77, 44, 55}
s1.discard(1)
s1.discard(66) # 66 不存在于s1中,所以没有任何影响
print('s1集合的元素是:', s1)
运行结果:
s1集合的元素是: {99, 44, 77, 55}
intersection
intersection是返回两个集合的交集,即两个集合相同的元素,该方法会返回一个新的集合
交集也可以使用运算符: &
例1:
s1 = {1, 99, 77, 44, 55}
s2 = {33, 44, 55, 66, 7}
ret = s1.intersection(s2) # 生成一个新的集合
print('s1和s2的交集是:', ret)
print('s1的元素是:', s1)
print('s2的元素是:', s2)
运行结果:
s1和s2的交集是: {44, 55}
s1的元素是: {1, 99, 44, 77, 55}
s2的元素是: {33, 66, 7, 44, 55}
例2:
使用运算符
s1 = {1, 99, 77, 44, 55}
s2 = {33, 44, 55, 66, 7}
ret = s1 & s2 # 生成一个新的集合
print('s1和s2的交集是:', ret)
print('s1的元素是:', s1)
print('s2的元素是:', s2)
运行结果:
s1和s2的交集是: {44, 55}
s1的元素是: {1, 99, 44, 77, 55}
s2的元素是: {33, 66, 7, 44, 55}
intersection_update
intersection_update是将两个集合的交集从新赋值给原集合,会改变原集合内容
例1:
s1 = {1, 99, 77, 44, 55}
s2 = {33, 44, 55, 66, 7}
s1.intersection_update(s2) # 修改集合s1
print('s1的元素是:', s1)
print('s2的元素是:', s2)
运行结果:
s1的元素是: {44, 55}
s2的元素是: {33, 66, 7, 44, 55}
isdisjoint
判断两个集合是否有交集,如果没有返回True,有返回False
例1:
s1 = {1, 99, 77, 44, 55}
s2 = {33, 66, 7}
print('s1和s2没有有交集: ', s1.isdisjoint(s2))
运行结果:
s1和s2没有有交集: True
issubset
用于判断一个集合是不是另一个集合的子集
也可以用运算符表示:<
例1:
s1 = {1, 99, 77, 44, 55}
s2 = {77, 44}
print('判断s2是不是s1的子集: ', s2.issubset(s1)) # 注意自己和自己比,结果是True
运行结果:
判断s2是不是s1的子集: True
例2:
s1 = {1, 99, 77, 44, 55}
s2 = {77, 44}
print('判断s2是不是s1的子集: ', s2 < s1) # 如果s2中有一个元素不是s1的元素, 返回肯定是False
运行结果:
判断s2是不是s1的子集: True
issupperset
用于判断一个集合是不是另一个集合的父集合
也可以用运算符表示:>
例1:
s1 = {1, 99, 77, 44, 55}
s2 = {77, 44}
print('判断s2是不是s1的父集: ', s2.issuperset(s1)) # s2 不是 s1的父集
print('判断s1是不是s2的父集: ', s1.issuperset(s2)) # s1 包含s2,是s2的父集
运行结果:
判断s2是不是s1的父集: False
判断s1是不是s2的父集: True
例1:
s1 = {1, 99, 77, 44, 55}
s2 = {77, 44}
print('判断s2是不是s1的父集: ', s2 > s1) # s2 不是 s1的父集
print('判断s1是不是s2的父集: ', s1 > s2) # s1 包含s2,是s2的父集
运行结果:
判断s2是不是s1的父集: False
判断s1是不是s2的父集: True
pop
pop用于从集合中随机删除一个元素(说是随机,但其实也有一定的规律),并返回这个元素,如果集合是一个空集合,会报KeyError
错
例1:
s1 = {1, 99, 77, 44, 55}
ret = s1.pop()
print('被删除的元素是:', ret)
print('s1的元素是:', s1)
运行结果:
被删除的元素是: 1
s1的元素是: {99, 44, 77, 55}
remove
remove是移除一个指定的元素,如果集合中不存在这个元素,报KeyError
错误
例1:
s1 = {1, 99, 77, 44, 55}
s1.remove(99)
print('移除99后的集合是:', s1)
s1.remove(100)
print('移除不存在的元素,会报错') # 不会打印这行,因为在上行就报错了
运行结果:
移除99后的集合是: {1, 44, 77, 55} # 移除的元素不存在,报错
Traceback (most recent call last):
File "/projects/oldboy/desktop-computer/week03/set_test.py", line 33, in
s1.remove(100)
KeyError: 100
symmetric_difference
symmetric_difference对称差集,是将两个集合中除去相同的元素,将各自不同的元素组合成一个新的集合,并返回
也可以使用符号: ^
例1:
s1 = {1, 99, 77, 44, 55}
s2 = {33, 44, 55, 66, 7}
ret = s1.symmetric_difference(s2)
print('s1和s2的对称差集是:', ret)
print('s1的元素是:', s1)
print('s2的元素是:', s2)
运行结果:
s1和s2的对称差集是: {33, 66, 1, 99, 7, 77}
s1的元素是: {1, 99, 44, 77, 55}
s2的元素是: {33, 66, 7, 44, 55}
例2:
使用符号
s1 = {1, 99, 77, 44, 55}
s2 = {33, 44, 55, 66, 7}
ret = s1 ^ s2
print('s1和s2的对称差集是:', ret)
print('s1的元素是:', s1)
print('s2的元素是:', s2)
运行结果:
s1和s2的对称差集是: {33, 66, 1, 99, 7, 77}
s1的元素是: {1, 99, 44, 77, 55}
s2的元素是: {33, 66, 7, 44, 55}
symmetric_difference_update
symmetric_difference_update是将对称差集赋值给原集合
s1 = {1, 99, 77, 44, 55}
s2 = {33, 44, 55, 66, 7}
s1.symmetric_difference_update(s2)
print('s1和s2的对称差集赋值给s1:', s1)
print('s2的元素是:', s2)
运行结果:
s1和s2的对称差集赋值给s1: {1, 33, 99, 66, 7, 77}
s1和s2的对称差集是: {33, 66, 7, 44, 55}
union
union是返回两个集合的并集,如果两个集合中有相同的部分,只会保留一份
并集也可以使用运算符: |
例1:
s1 = {1, 99, 77, 44, 55}
s2 = {33, 44, 55, 66, 7}
ret = s1.union(s2)
print('s1和s2的并集是::', ret)
print('s1的元素是:', s1)
print('s2的元素是:', s2)
运行结果:
s1和s2的并集是:: {1, 33, 99, 66, 7, 44, 77, 55}
s1的元素是: {1, 99, 44, 77, 55}
s2的元素是: {33, 66, 7, 44, 55}
例2:
使用运算符
s1 = {1, 99, 77, 44, 55}
s2 = {33, 44, 55, 66, 7}
ret = s1 | s2
print('s1和s2的并集是::', ret)
print('s1的元素是:', s1)
print('s2的元素是:', s2)
运行结果:
s1和s2的并集是:: {1, 33, 99, 66, 7, 44, 77, 55}
s1的元素是: {1, 99, 44, 77, 55}
s2的元素是: {33, 66, 7, 44, 55}
update
update用于和一个集合添加元素,相当于将两个集合合并后,从新赋值给原集合
例1:
s1 = {1, 99, 77, 44, 55}
s2 = {33, 44, 55, 66, 7}
s1.update(s2)
print('s1的元素是:', s1)
print('s2的元素是:', s2)
运行结果:
s1的元素是: {1, 33, 99, 66, 7, 44, 77, 55}
s2的元素是: {33, 66, 7, 44, 55}