继 《Python 基础备忘之 List 篇》 之后,今天继续整理 Python Set 相关知识。灵感来源于 Cheat sheets,Cheat sheets 类似于考试时的小抄,将某个需要学习的东西精华整理在一页或几页纸上。编程初学者,找一个最适合自己的版本 ,然后下载并打印出来。一张纸囊括核心内容。进阶或高手,鼓励创作并共享 Cheat sheets,或梳理知识,或为社区作贡献。
什么是 Set
set 对象是由具有唯一性的 hashable 对象所组成的无序多项集。 常见的用途包括成员检测、从序列中去除重复项以及数学中的集合类计算,例如交集、并集、差集与对称差集等等。
与其他多项集一样,集合也支持 x in set
, len(set)
和 for x in set
。 作为一种无序的多项集,集合并不记录元素位置或插入顺序。 相应地,集合不支持索引、切片或其他序列类的操作。
除了可以使用 set 构造器,非空的 set (不是 frozenset) 还可以通过将以逗号分隔的元素列表包含于花括号之内来创建,例如:{'jack', 'sjoerd'}
。
创建 Set
使用花括号内以逗号分隔元素的方式: {'jack', 'sjoerd'}
:
s = {'jack', 'sjoerd'}
# 不能这样创建一个空集合,这是一个字典
s = {}
# 应该使用其类型构造器来创建一个空集合
s = set()
s.add('cat')
使用集合推导式: {c for c in 'abracadabra' if c not in 'abc'}
:
s = {c for c in 'abracadabra' if c not in 'abc'}
# {'d', 'r'}
使用类型构造器,语法,set([iterable])
: set()
, set('foobar')
,set(['a', 'b', 'foo'])
:
s = set()
s = set('foobar')
# {'o', 'b', 'a', 'f', 'r'}
s = set(['a', 'b', 'foo'])
# {'b', 'a', 'foo'}
向 Set 中添加元素
使用 add(elem)
方法添加单个元素:
s = {'cat'}
s.add('dog')
s.add('bird')
# {'cat', 'bird', 'dog'}
使用 update(*others)
方法添加多个元素:
s = {'cat'}
s.update(['dog','bird','gerbil'])
# {'cat', 'bird', 'dog', 'gerbil'}
其实 update
也是一种集合操作,其中的方法命名规则以 _update(*others)
为结尾:
intersection_update(*others)
,更新集合,只保留其中在所有 others 中也存在的元素。difference_update(*others)
,更新集合,移除其中也存在于 others 中的元素。symmetric_difference_update(other)
,更新集合,只保留存在于集合的一方而非共同存在的元素。
访问 Set 中的元素
Set 和 List 不一样,无法通过索引访问,可以通过循环遍历元素:
s = {'cat', 'bird', 'dog', 'gerbil'}
for a in s:
print(a)
在 Python 的集合中,通常还可以通过 in
操作来检查一个元素是否存在于集合中:
s = {'cat', 'bird', 'dog', 'gerbil'}
'cat' in s
# True
'duck' in s
# False
从 Set 中删除元素
- 使用
remove(elem)
删除元素, 如果 elem 不存在于集合中则会引发KeyError
; - 使用
discard(elem)
删除元素,如果元素 elem 存在于集合中则将其移除; - 使用
pop()
从集合中删除并返回任意一个元素。 如果集合为空则会引发KeyError
; - 使用
clear()
从集合中删除所有元素。
s = {'cat', 'bird', 'dog', 'gerbil'}
s.remove('cat')
s.discard('duck')
s.pop()
s.clear()
Python 中 Set 的操作
Python 提供了关于 Set 对象的一整套操作,这些操作通常模仿为数学集定义的操作。可以使用 文氏图(Venn diagrams) 辅助学习。
Python 中的大多数集合操作可以通过两种不同的方式执行,可以通过运算符或者通过方法都可以。
操作 | 定义 | 操作符 | 方法 |
---|---|---|---|
并集 | 返回一个新集合,其中包含来自原集合以及 others 指定的所有集合中的元素。 | | | union(*others) |
交集 | 返回一个新集合,其中包含原集合以及 others 指定的所有集合中共有的元素。 | & | intersection(*others) |
差集 | 返回一个新集合,其中包含原集合中在 others 指定的其他集合中不存在的元素。 | - | difference(*others) |
对称差 | 返回一个新集合,其中的元素或属于原集合或属于 other 指定的其他集合,但不能同时属于两者。 | ^ | symmetric_difference(other) |