Python也包含有 集合
类型。集合是由不重复元素
组成的无序
的集。它的基本用法包括成员检测和消除重复元素。集合对象也支持像 联合,交集,差集,对称差分等数学运算。
花括号或 set() 函数可以用来创建集合。注意:要创建一个空集合你只能用 set() 而不能用 {},因为后者是创建一个空字典,这种数据结构我们会在下一节进行讨论
。
1.集合定义
>>> type({1,2,3,4})
<class 'set'>
>>> type({})
<class 'dict'>
# 定义一个空集合
>>> aset = set()
>>> aset
set()
# 集合不重复
>>> set({1,2,1,2})
{1,2}
>>> a = set('abracadabra')
>>> a
{'d', 'b', 'a', 'r', 'c'}
# 列表推导式
>>> a = {x for x in 'abracadabra' if x not in 'abc'}
>>> a
{'r', 'd'}
2.集合方法
函数名 | 描述 | 示例 | 结果 |
---|
set.update(set) | 更新集合 | aset = {1,2,3,4} aset.update({7,8}) | {1, 2, 3, 4, 7, 8} |
set.discard(obj) | 移除集合元素,移除不存在的元素不会报错 | {1,2,3,4}.discard(5) | {1,2,3,4} |
set.remove(obj) | 移除不存的元素会报错 | {1,2,3,4}.remove(4) | {1,2,3} |
set.pop() | 移除集合中最后一个元素 | {1,2,3}.pop() | 3 |
set.add(obj) | 在集合中追加一个元素 | {1,2,3}.add(9) | {1,2,3,9} |
set.clear() | 清空集合 | {1,2,3}.clear() | {} |
3.集合操作
>>> 1 in {1,2,3}
True
>>> 1 not in {1,2,3}
False
4.交集
intersection
, intersection_update
,也可以使用a&b
>>> aset = {11,22,33}
>>> bset = {33,44,55}
# 取交集,赋给新值
>>> aset.intersection(bset)
{33}
>>> aset
{11,22,33}
#取交集并更新自己
>>> aset.intersection_update(bset)
>>> aset
{33}
# 取交集
>>> aset & bset
5.并集
>>> aset = {11,22,33}
>>> bset = {22,44,55}
>>> tmp = aset.union(bset)
>>> aset
{33, 11, 22}
>>> tmp
{33, 22, 55, 11, 44}
>>> aset | bset
{33, 22, 55, 11, 44}
6.差集
difference
, difference_update
,也可以使用a-b
>>> aset = {11,22,33}
>>> bset = {22,55}
>>> tmp = aset.difference(bset) #找到aset中存在,bset中不存在的集合,返回新值
>>> tmp
{33, 11}
>>> aset - bset
{33, 11}
>>> aset
{11,22,33}
>>> tmp2 = aset.difference_update(bset) #找到aset中存在,bset中不存在的集合,覆盖掉aset
>>> tmp2
None
>>> aset
{33,11}
7.包含关系
两个集合之间一般有三种关系,相交、包含、不相交。在Python中分别用下面的方法判断:
- set.isdisjoint(s):判断两个集合是不是不相交
- set.issuperset(s):判断集合是不是包含其他集合,等同于
a>=b
- set.issubset(s):判断集合是不是被其他集合包含,等同于
a<=b
如果要真包含关系,就用符号操作>
和<
>>> aset = {11,22,33}
>>> bset = {22}
>>> aset.isdisjoint(bset) #判断是否不存在交集(有交集False,无交集True)
False
>>> aset.issubset(bset) #判断se是否是be的子集合
False
>>> aset <= bset
False
>>> aset.issuperset(bset) #判断se是否是be的父集合
True
>>> aset >= bset
True
8.合并
symmetric_difference, symmetric_difference_update
>>> aset = {11,22,33}
>>> bset = {22}
>>> tmp = aset.symmetric_difference(bset)
>>> tmp
{33, 11}
>>> aset
{33, 11, 22}
>>> tmp2 = aset.symmetric_difference_update(bset)
>>> tmp2
None
>>> aset
{33,11}
9.集合转换
集合可以转换为list、tuple、str
>>> aset = {1,2,3,4}
>>> list(aset)
[1, 2, 3, 4]
>>> tuple(aset)
(1, 2, 3, 4)
>>> str(aset)
'{1, 2, 3, 4}'
10.不可变集合
Python提供了不能改变元素的集合的实现版本,即不能增加或删除元素,类型名叫frozenset。需要注意的是frozenset仍然可以进行集合操作,只是不能用带有update的方法。如果要一个有frozenset中的所有元素的普通集合,只需把它当作参数传入集合的构造函数中即
>>> aset = frozenset("hello")
>>> aset
frozenset({'o', 'l', 'h', 'e'})
>>> aset = set(aset)
>>> aset.add(12)
>>> aset
{'l', 12, 'e', 'h', 'o'}