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"}        # 可哈希,能作键

小结:集合擅长"去重、判成员、集合关系运算";无序但查找极快,配合推导式可写出简洁高效的过滤代码。

笔记加载中…