第 21 课 · 阶段三 · 数据结构

集合 Set

集合就像数学里的集合:元素不重复、无序。这一课掌握集合的创建、去重应用与交并差运算。

第 21 课阶段三 · 数据结构难度:入门建议时长:30 分钟关键词:去重 · 交并差 · 集合运算

🎯 学完本课你将掌握

  • 创建集合并理解其无序、去重特性
  • 用集合完成数据去重
  • 掌握交集、并集、差集等运算

一、创建集合

创建集合.py
1s1 = {1, 2, 3}
2s2 = set([1, 2, 2, 3, 3]) # 从列表创建,自动去重
3s3 = set() # 空集合(不能用{},那是空字典)
4print(s2) # {1, 2, 3} 重复被去掉
⚠️ 注意
{} 创建的是空字典,空集合必须用 set()。

二、集合三大特性

三、最常用场景:去重

去重.py
1nums = [1, 2, 2, 3, 3, 3, 4, 1, 5]
2unique = list(set(nums))
3print(unique) # [1, 2, 3, 4, 5](顺序不保证)
💡 提示
一行代码去重:list(set(列表)),是面试高频考点。

四、增删元素

增删.py
1s = {1, 2, 3}
2s.add(4) # 添加
3s.add(2) # 已存在,不报错也不重复
4s.discard(10) # 删除,不存在也不报错
5s.remove(3) # 删除,不存在会报错
6print(s) # {1, 2, 4}

五、集合运算(数学课回来啦)

集合运算.py
1a = {1, 2, 3, 4}
2b = {3, 4, 5, 6}
3print(a & b) # 交集 {3, 4}
4print(a | b) # 并集 {1,2,3,4,5,6}
5print(a - b) # 差集 {1, 2}
6print(a ^ b) # 对称差 {1, 2, 5, 6}
7print(a.intersection(b)) # 等价于 a & b
运算符方法含义
&intersection()交集:两边都有
|union()并集:合并去重
-difference()差集:A有B没有
^symmetric_difference()对称差:只在一个集合中

六、子集与超集判断

包含关系.py
1a = {1, 2}
2b = {1, 2, 3}
3print(a.issubset(b)) # True a是b的子集
4print(b.issuperset(a)) # True b是a的超集
5print(a.isdisjoint({9})) # True 无交集

七、常见错误与解决

常见错误与解决

错误现象原因 / 解决方法
TypeError: unhashable type: 'list'把列表放进集合了,先转成元组:set([tuple(x) for x in lst])。
用下标访问集合报错集合无序,不能用 s[0],用 for 遍历或转 list。
去重后顺序变了set 不保证顺序;要保序去重可遍历时记录。
✍️ 小练习
有两个班级名单(列表,含重复),用集合找出:两班都有的同学、只在一班出现的同学、去重后的总人数。
📌 本节小结
集合 = 去重 + 无序 + 集合运算。list(set(x)) 一行去重,& | - ^ 完成交并差与对称差。适合去重、判重、找共同点等场景。