侧边栏壁纸
博主头像
phphi

phphi's blog

  • 累计撰写 51 篇文章
  • 累计收到 0 条评论

Day12 - 常用数据结构之集合

2026-4-24 / 0 评论 / 1 阅读

常用数据结构之集合

集合基础

集合(set)是无序且不包含重复元素的容器,跟数学中的集合概念一致:

  • 无序性:元素没有固定顺序,不支持索引运算
  • 互异性:元素不重复,自动去重
  • 确定性:元素要么在集合中,要么不在

创建集合

# 基础创建
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()

注意:集合元素必须是可哈希类型(不可变类型),如 intstrtuple,不能用 listsetdict

集合运算

交集、并集、差集、对称差

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}

子集和超集

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(元素相同即相等)

集合方法

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 是不可变版本,可作为其他集合的元素:

fset = frozenset({1, 3, 5, 7})
print(fset | frozenset({2, 4}))  # frozenset({1, 2, 3, 4, 5, 7})

总结

  • 集合:无序、去重、支持交集/并集/差集/对称差运算
  • 集合不支持索引和切片
  • 集合元素必须是不可变类型
  • frozenset 是不可变集合,可作为字典键或嵌套使用