Python 入门笔记(八)集合(Set)
初识集合
与数学中的集合一样,Python中 集合(set)
中每一个元素都是独一无二的,因而集合具有去重功能
Python 中的集合很强大,你可以对集合轻松执行各种运算
新建集合
使用大括号 {}
集合和字典有时很容易弄混,因为它们都是用一对花括号定义的
只不过当内容是键值对时,表示的是字典,内容是诺干单独元素时,表示的是集合
1 | languages = {'python', 'c', 'ruby', 'python'} |
使用 set()
使用 set()
函数可以将其他类型转换为集合
1 | a = set("12345") # 字符串转集合 |
注意:
- 集合不会以特定的顺序储存元素,反复执行上面的代码,输出元素的顺序会不同,当你使用
for ... in ...
结构时,提取出来的元素的顺序也是不定的- 当创建空集合时,必须使用
set()
,因为{}
意为创建一个新字典
集合运算
在进行集合运算时,使用 集合运算符 或 集合的方法 有时可以达到相同的效果
如果你从未了解过集合运算,下面这张图可能有所帮助
点击以打开
交集:A & B
在 A 与 B 中都有的元素,等同于 A.intersection(B)
方法
1 | print(sorted(a & b)) |
另一个与交集有关的方法是 A.isdisjoint(B)
,如果两个集合没有交集,则返回 True
1 | print(a.isdisjoint(b)) # False |
并集:A | B
A 与 B 中的全部元素,等同于 A.union(B)
方法
1 | print(sorted(a | b)) |
补集:A - B
在 A 中有,而不在 B 中有的元素,等同于 A.difference(B)
方法
1 | print(sorted(a - b)) |
这里的补集应为 广义上的补集 ,包括 绝对补集(一般意义的补集)和 相对补集(差集)
对称差集:A ^ B
不同时包含于 A、B 的元素(并集中除去交集),等同于 A.symmetric_difference(B)
方法
1 | print(sorted(a ^ b)) |
上面的四个集合方法可以传入多个参数,表示连续运算,如
A.intersection(B,C)
子集 / 真子集:A <= B
/ A < B
其中,A <= B
等同于 A.issubset(B)
1 | print(set("123") < a) # True |
包含 / 超集:A >= B
/ A > B
其中,A >= B
等同于 A.issuperset(B)
1 | print(set("1234567890") > a) # True |
元素是否在集合中:in
/ not in
1 | print(3 in {1, 2, 3}) # True |
集合其他常用方法/函数
统计元素个数
len()
1 | print(len(a)) # 5 |
添加
set.add(obj)
将单个元素添加至集合中,如果元素已经在集合中,则不进行任何操作
1 | a.add('0') |
set.update(seq[,seq2,seq3,...])
将 seq
中的元素添加至集合中,seq
可以是是列表,元组,字典等,可以同时传入多个参数
1 | a.update(['6', '7', '8', '9']) |
删除
set.remove(obj)
在集合中移除一个元素,如果找不到该元素就会报错
1 | a.remove('3') |
set.discard(obj)
与前者基本相同,但找不到元素不会报错
1 | a.discard('3') |
set.pop(obj)
随机弹出一个元素,如果集合为空则会报错
1 | a = set("12345") |
set.clear()
清空集合
1 | a.clear() |
复制
set.copy()
返回一个集合的拷贝
不可变集
仿照列表与元组的关系,Python 中集合对应着不可变集
除了内部元素不可改变,其他地方与普通集合一模一样
不可变集使用 frozenset()
创建
虽然我也不知道这个有什么用