集合专题
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])
它不能修改,但可以做集合运算,也能作为字典键。
一个我常踩的提醒
集合是无序容器,不要假设它会保留你插入元素的顺序。即使某些时候“看起来像保留了”,也不要把这种行为写进逻辑里。