# 常用数据结构之集合 ## 集合基础 集合(set)是无序且不包含重复元素的容器,跟数学中的集合概念一致: - **无序性**:元素没有固定顺序,不支持索引运算 - **互异性**:元素不重复,自动去重 - **确定性**:元素要么在集合中,要么不在 ## 创建集合 ```python # 基础创建 set1 = {1, 2, 3, 3, 2} # {1, 2, 3},自动去重 set2 = {'apple', 'banana', 'apple'} # {'apple', 'banana'} # 从序列转换 set3 = set('hello') # {'h', 'e', 'l', 'o'},自动去重 set4 = set([1, 2, 2, 3, 3]) # {1, 2, 3} # 集合生成式 set5 = {x for x in range(1, 20) if x % 3 == 0 or x % 7 == 0} ``` > **注意**:`{}` 表示空字典,不是空集合。空集合用 `set()`。 > **注意**:集合元素必须是可哈希类型(不可变类型),如 `int`、`str`、`tuple`,不能用 `list`、`set`、`dict`。 ## 集合运算 ### 交集、并集、差集、对称差 ```python set1 = {1, 2, 3, 4, 5, 6, 7} set2 = {2, 4, 6, 8, 10} print(set1 & set2) # 交集: {2, 4, 6} print(set1 | set2) # 并集: {1, 2, 3, 4, 5, 6, 7, 8, 10} print(set1 - set2) # 差集: {1, 3, 5, 7} print(set1 ^ set2) # 对称差: {1, 3, 5, 7, 8, 10} ``` ### 子集和超集 ```python a = {1, 3, 5} b = {1, 2, 3, 4, 5} print(a < b) # True(a是b的真子集) print(a <= b) # True(a是b的子集) print(b > a) # True(b是a的超集) print(a == {5, 3, 1}) # True(元素相同即相等) ``` ## 集合方法 ```python s = {1, 10, 100} # 添加元素 s.add(1000) # 添加(重复则忽略) s.update({5, 50}) # 批量添加 # 删除元素 s.discard(10) # 删除(不存在不报错) s.remove(100) # 删除(不存在抛KeyError) popped = s.pop() # 随机删除并返回 # 判断 print(s.isdisjoint({3, 6})) # True(无交集) ``` > **建议**:删除元素用 `discard()` 比 `remove()` 更安全。 ## 不可变集合 `frozenset` 是不可变版本,可作为其他集合的元素: ```python fset = frozenset({1, 3, 5, 7}) print(fset | frozenset({2, 4})) # frozenset({1, 2, 3, 4, 5, 7}) ``` ## 总结 - 集合:无序、去重、支持交集/并集/差集/对称差运算 - 集合不支持索引和切片 - 集合元素必须是不可变类型 - `frozenset` 是不可变集合,可作为字典键或嵌套使用