第 21 课 · 阶段三 · 数据结构
集合 Set
集合就像数学里的集合:元素不重复、无序。这一课掌握集合的创建、去重应用与交并差运算。
🎯 学完本课你将掌握
- 创建集合并理解其无序、去重特性
- 用集合完成数据去重
- 掌握交集、并集、差集等运算
一、创建集合
创建集合.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)) 一行去重,& | - ^ 完成交并差与对称差。适合去重、判重、找共同点等场景。