跳到主要内容

集合专题

set 是 Python 里一个特别实用、但容易被低估的容器。只要问题里出现下面这些关键词,我通常就会先想到集合:

  • 去重
  • 判重
  • 是否访问过
  • 交集、并集、差集

创建集合

numbers = {1, 2, 3, 4}
empty = set()

注意:{} 创建的是空字典,不是空集合。

增删查

visited = {1, 2, 3}

visited.add(4)
visited.remove(2)
visited.discard(10)
print(3 in visited)

区别:

  • remove(x):元素不存在会报错
  • discard(x):元素不存在也不会报错

集合运算

a = {1, 2, 3, 4}
b = {3, 4, 5, 6}

print(a | b) # 并集
print(a & b) # 交集
print(a - b) # 差集
print(a ^ b) # 对称差集

最常见的应用:去重

numbers = [1, 2, 2, 3, 3, 4]
unique_numbers = list(set(numbers))

如果你还想保留原始顺序,单纯 set() 就不够了,需要别的方法。

第二类高频应用:访问标记

图搜索、DFS、BFS 里我几乎都会写一个 visited 集合:

graph = {
"A": ["B", "C"],
"B": ["A", "D"],
"C": ["A"],
"D": ["B"],
}

visited = set()

frozenset

如果你需要“不可变集合”,可以用 frozenset

fs = frozenset([1, 2, 3])

它不能修改,但可以做集合运算,也能作为字典键。

一个我常踩的提醒

集合是无序容器,不要假设它会保留你插入元素的顺序。即使某些时候“看起来像保留了”,也不要把这种行为写进逻辑里。

关联阅读