Python3 集合
集合(set)与数学中的集合概念一致:一个无序、不重复的元素容器,适合去重与交集、并集等运算,成员判断也很快。注意创建空集合必须用 set(),因为 {} 表示空字典。
set 特性
无序、自动去重、内容可增删,但元素本身必须可哈希(不可变类型):
s = {1, 2, 2, 3, 3, 3}
print(s) # 输出:{1, 2, 3}(重复被自动去掉)
创建 set()
用花括号字面量或 set() 从其他可迭代对象创建;空集合只能用 set():
s1 = {1, 2, 3}
s2 = set([1, 2, 2]) # 从列表创建并去重
empty = set() # 空集合
print(s2) # 输出:{1, 2}
增删元素
s = {1, 2}
s.add(3) # 添加
s.remove(2) # 删除,不存在则抛 KeyError
s.discard(99) # 删除,不存在也不报错
x = s.pop() # 随机删除并返回一个元素
print(s) # 输出:{2, 3} 或 {1, 3}(顺序不定)
集合运算
交集 &、并集 |、差集 -、对称差 ^,也有同名方法(intersection 等):
a = {1, 2, 3}
b = {2, 3, 4}
print(a & b) # 交集:同时在两个集合 -> {2, 3}
print(a | b) # 并集:合并去重 -> {1, 2, 3, 4}
print(a - b) # 差集:在 a 不在 b -> {1}
print(a ^ b) # 对称差:只在一个集合 -> {1, 4}
子集判断
print({1, 2}.issubset({1, 2, 3})) # 输出:True
print({1, 2} <= {1, 2, 3}) # 输出:True
print(1 in {1, 2}) # 成员判断 -> 输出:True
去重应用
转成 set 快速去重但顺序不定;要保序可用推导式按原序过滤:
nums = [3, 1, 3, 2, 1]
print(list(set(nums))) # 输出:[1, 2, 3](顺序不定)
# 保序去重:用集合记录已出现过的元素
seen = set()
uniq = [x for x in nums if not (x in seen or seen.add(x))]
print(uniq) # 输出:[3, 1, 2]
frozenset
frozenset 是不可变集合,创建后不能增删,可作字典键或另一集合的元素:
fs = frozenset([1, 2, 3])
print(fs) # 输出:frozenset({1, 2, 3})
d = {fs: "ok"} # 可哈希,能作键
小结:集合擅长"去重、判成员、集合关系运算";无序但查找极快,配合推导式可写出简洁高效的过滤代码。