微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io
如果代码和注释不一致,那很可能两者都错了。
—— Norm Schryer
目录

前几节我们已经介绍了Python 中的列表list ,元组tuple 和 字典dict ,本节来介绍Python 中的最后一种数据结构——集合set 。
>>> set
<type 'set'>
1,Python 集合
Python 中的set 与 dict 很像,唯一的不同是,dict 中保存的是键值对 ,而set 中只保存键 ,没有值 。
Python 集合 有如下特点:
- 集合中的元素是
唯一 的,不重复 的
- 集合中的元素是
无序 的
- 集合中的元素可以是任意一种
不可变 类型,比如字符串 ,数字 ,元组
- 集合中的元素可以动态的
增加/删除
- Python 会在需要的时候自动的
扩容 和缩容 集合,方便开发者使用
2,声明集合
Python 集合的声明有两种方式:
- 使用
set() 创建集合,() 中可为空,也可以是任意的可迭代 类型,比如列表 ,元组 ,字典
- 使用大括号
{} 创建集合,从该创建方式上也能看出集合 与字典 很像
创建空集合 时,只能用set() ,而不能用{} :
>>> s = set() # 空集合
>>> s
set()
>>> s = {} # 空的 {} 会被解析成字典
>>> s
{}
创建非空集合 时,可以用set() ,也可以用{} :
>>> s = {1,'abc',1.5} # 用 {} 创建集合
>>> s
{1,1.5}
>>> s = set([1,1.5]) # 用列表创建集合
>>> s
{1,1.5}
>>> s = set((1,1.5)) # 用元组创建集合
>>> s
{1,1.5}
>>> s = set({'a':1,'b':2,'c':3}) # 用字典创建集合
>>> s # 只会包含字典中的键
{'c','b','a'}
由于集合中的元素是唯一的,如果初始化时的可迭代 数据中有重复的元素,则会自动删去重复的元素:
>>> s = set([1,2,3]) # 列表中有两个 2
>>> s # 集合中只有一个 2
{1,3}
3,集合元素个数
使用len() 函数可以查看集合中元素的个数:
>>> s = set([1,1.5])
>>> s
{1,1.5}
>>> len(s) # 元素个数
3
4,访问集合元素
由于Python 集合中的元素的是无序的,所以可不能使用下标 的方式来访问集合中的单个元素。
我们可以使用for 循环 来遍历集合中的所有元素:
>>> s = set([1,1.5])
>>> for i in s:
... print(i)
...
1
abc
1.5
5,集合运算
我们可以对两个集合进行如下运算:
-
& 运算 :计算集合的交集
-
| 运算 :计算集合的并集
-
in 运算 :判断某个元素是否在集合中
交集与并集
>>> s1 = set([1,3])
>>> s2 = set([2,3,4])
>>> s1 & s2 # 交集
{2,3}
>>> s1 | s2 # 并集
{1,4}
in 运算
>>> s = set([1,3])
>>> 1 in s
True
>>> 2 not in s
False
6,集合函数
使用dir(set) 查看集合支持的所有方法:
>>> dir(set)
['__and__','__class__','__contains__','__delattr__','__dir__','__doc__','__eq__','__format__','__ge__','__getattribute__','__gt__','__hash__','__iand__','__init__','__init_subclass__','__ior__','__isub__','__iter__','__ixor__','__le__','__len__','__lt__','__ne__','__new__','__or__','__rand__','__reduce__','__reduce_ex__','__repr__','__ror__','__rsub__','__rxor__','__setattr__','__sizeof__','__str__','__sub__','__subclasshook__','__xor__','add','clear','copy','difference','difference_update','discard','intersection','intersection_update','isdisjoint','issubset','issuperset','pop','remove','symmetric_difference','symmetric_difference_update','union','update']
下面一一介绍这些非魔法方法 ,共17 个。
1.add 方法
作用:向集合S 中添加元素 原型:S.add(...) -> None 参数:任意不可变 类型数据 返回值: 总是返回 None
由于集合中的元素是唯一的,向集合中添加元素时有两种情况:
- 添加的元素集合中不存在:只要元素类型合法,就会成功添加进去
- 添加的元素集合中已存在:不会对集合进行任何操作
示例:
>>> s = set([1,5]) # 初始化一个集合
>>> s
{1,5}
>>> s.add(7) # 向集合中添加一个不存在的元素
>>> s
{1,5,7}
>>> s.add(5) # 向集合中添加一个已存在的元素
>>> s
{1,7}
2.remove 方法
作用:删除集合S 中的元素 原型:S.remove(...) -> None 参数:任意不可变 类型数据 返回值:当要删除的元素存在时,返回None ,否则,抛出异常
示例:
>>> s = set([1,5])
>>> s
{1,5}
>>> s.remove(3) # 元素 3 存在
>>> s # 成功删除
{1,5}
>>> s.remove(3) # 元素 3,已不存在
Traceback (most recent call last):
File "<stdin>",line 1,in <module>
KeyError: 3 # 抛出异常
3.discard 方法
作用:用于删除集合S 中的元素,与remove 方法的不同是,如果元素不存在,不会抛出异常 原型:S.discard(...) -> None 参数:任意不可变 类型数据 返回值:总是返回None
示例:
>>> s = set([1,6])
>>> s.discard(3) # 删除一个已存在的元素
>>> s
{1,6}
>>> s.discard(7) # 删除一个不存在的元素
>>> s
{1,6}
4.pop 方法
作用:随机删除并返回集合S 中的一个元素 原型:S.pop() -> item 参数:无 返回值:被删除的元素,如果集合为空,抛出异常
示例:
>>> s = set([3,1])
>>> s.pop() # 删除并返回 1
1
>>> s.pop() # 删除并返回 3
3
>>> s.pop() # 删除并返回 5
5
>>> s # 集合为空
set()
>>> s.pop() # 抛出异常
Traceback (most recent call last):
File "<stdin>",in <module>
KeyError: 'pop from an empty set'
5.union 方法
作用:用于合并多个集合,相当于多个集合做并集运算 原型:set.union(...) -> set 参数:任意多个可迭代类型数据 返回值: 返回新的集合
示例:
>>> # 参数中有集合,元组,列表
>>> set.union({2,3},(3,5),[5,6])
{2,6}
6.update 方法
作用:向集合S 中添加元素 原型:S.update(...) -> None 参数:任意多个可迭代类型数据 返回值:总是返回 None
示例:
>>> s = set({2})
>>> s
{2}
>>> s.update({3,5},{5,6},[7,8])
>>> s
{2,6,7,8}
7.clear 方法
作用:清空集合S 原型:S.clear() -> None 参数:无 返回值:总是返回None
示例:
>>> s = set([1,5}
>>> s.clear()
>>> s # 集合为空
set()
8.copy 方法
作用:浅拷贝集合S 原型:S.copy( ) -> set 参数:无 返回值:一个集合
示例:
>>> s = set([1,5}
>>> s1 = s.copy()
>>> s1
{1,5}
9.difference 方法
作用:集合的差集 原型:S.difference(...) -> set 参数:任意多个可迭代类型数据 返回值:一个集合
示例:
>>> s = set([1,6])
>>> # 参数可以是任意的可迭代类型
>>> s.difference({1},[3],(4,5))
{6}
10.difference_update 方法
作用:集合的差集,与difference 方法的不同是,difference_update 直接在集合S 上做修改 原型:S.difference_update(...) -> None 参数:任意多个可迭代类型数据 返回值:总是返回None
示例:
>>> s = set([1,6])
>>> s.difference_update({1},5))
>>> s
{6}
11.intersection 方法
作用:集合的交集 原型:S.intersection(...) -> set 参数:任意多个可迭代类型数据 返回值:一个集合
示例:
>>> s = set([1,6])
>>> s.intersection({1},5)) # 相当于 s & {1} & [3] & (4,5)
set()
>>> s.intersection({1,[3,4],4,5)) # 相当于 s & {1,3} & [3,4] & (3,5)
{3}
12.intersection_update 方法
作用:集合的交集,与intersection 方法的不同是,intersection_update 直接在集合S 上做修改 原型:S.difference_update(...) -> None 参数:任意多个可迭代类型数据 返回值:总是返回None
示例:
>>> s = set([1,6])
>>> s.intersection_update({1,5))
>>> s
{3}
13.isdisjoint 方法
作用:用于判断两个集合中是否有相同的元素 原型:S.isdisjoint(...) -> bool 参数:任意可迭代类型数据 返回值:如果有相同的元素,返回False ,否则,返回True
示例:
>>> s1 = set([1,3])
>>> s2 = set([3,5])
>>> s3 = set([5,6])
>>> s1.isdisjoint(s2) # s1,s2 中有相同的元素
False
>>> s1.isdisjoint(s3) # s1,s3 中没有相同的元素
True
>>> s1.isdisjoint((4,5)) # 参数是元组
True
14.issubset 方法
作用:判断集合S 是否是另一个集合的子集 原型:S.issubset(...) -> bool 参数:任意可迭代类型数据 返回值:bool 类型
示例:
>>> s = set([1,5])
>>> s.issubset({1,7}) # 参数是字典
True
>>> s.issubset([1,7]) # 参数是数组
True
>>> s.issubset([1,7])
False
15.issuperset 方法
作用:判断一个集合是否是另一个集合S 的子集,是issubset 方法的反义 原型:S.issuperset(...) -> bool 参数:任意可迭代类型数据 返回值:bool 类型
示例:
>>> s.issuperset({1,7})
False
>>> s.issuperset({1,3})
True
16.symmetric_difference 方法
作用:返回两个集合中不重复的元素集合 原型:S.symmetric_difference(...) -> set 参数:任意可迭代类型数据 返回值:一个集合
示例:
>>> s = set([1,5}
>>> s.symmetric_difference([8,9])
{1,8,9}
>>> s.symmetric_difference([8,3])
{8,1,5}
17.symmetric_difference_update 方法
作用:求两个集合中不重复的元素集合,与symmetric_difference 方法的不同是,symmetric_difference_update 方法,直接在S 修改 原型:S.symmetric_difference_update(...) -> None 参数:任意可迭代类型数据 返回值:总是返回None
示例:
>>> s = set([1,5])
>>> s.symmetric_difference_update({6,8})
>>> s
{1,8}
>>> s.symmetric_difference_update({6,5}
(完。)
推荐阅读:
Python 简明教程 --- 8,Python 字符串函数
Python 简明教程 --- 9,Python 编码
Python 简明教程 --- 10,Python 列表
Python 简明教程 --- 11,Python 元组
Python 简明教程 --- 12,Python 字典
欢迎关注作者公众号,获取更多技术干货。
 (编辑:北几岛)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|