🔮 09. 集合 set 详解
本章概述
学习 Python 集合的定义、操作和常用方法。 预计学习时间:40 分钟
9.1 集合定义
集合是无序、不重复的元素集合,类似数学中的集合概念。
# 空集合(注意:不能用{},那是空字典!)
s = set()
# 有元素的集合
s = {1, 2, 3, 4, 5}
# 自动去重
s = {1, 2, 2, 3, 3, 3}
print(s) # {1, 2, 3}空集合
{}是空字典,不是空集合! 空集合必须用set()创建。
集合特点
- ✅ 元素不重复(自动去重)
- ✅ 无序(没有索引,不能切片)
- ✅ 元素必须是不可变类型
- ✅ 支持数学集合运算(交集、并集、差集等)
- ✅ 查找速度非常快(O(1))
9.2 集合的增删改查
增
s = {1, 2, 3}
# add:添加一个元素
s.add(4)
print(s) # {1, 2, 3, 4}
# update:添加多个元素(可以是列表、元组、集合等)
s.update([5, 6])
print(s) # {1, 2, 3, 4, 5, 6}删
s = {1, 2, 3, 4, 5}
# remove:删除指定元素(不存在会报错)
s.remove(3)
print(s) # {1, 2, 4, 5}
# s.remove(10) # ❌ KeyError
# discard:删除指定元素(不存在不报错)
s.discard(4)
print(s) # {1, 2, 5}
s.discard(10) # 不报错,什么也不做
# pop:随机删除并返回一个元素
s.pop()
# clear:清空集合
s.clear()
print(s) # set()查
s = {1, 2, 3}
# 判断元素是否存在
3 in s # True
10 in s # False
# 长度
len(s) # 3集合不能通过索引取值
集合是无序的,没有索引,不能用
s[0]这种方式取值。
9.3 集合运算(数学集合)
并集 union
两个集合的所有元素(去重)
a = {1, 2, 3}
b = {3, 4, 5}
a | b # {1, 2, 3, 4, 5}
a.union(b) # {1, 2, 3, 4, 5}交集 intersection
两个集合共有的元素
a = {1, 2, 3}
b = {3, 4, 5}
a & b # {3}
a.intersection(b) # {3}差集 difference
在a中但不在b中的元素
a = {1, 2, 3}
b = {3, 4, 5}
a - b # {1, 2}
a.difference(b) # {1, 2}对称差集 symmetric_difference
不同时在两个集合中的元素(并集 - 交集)
a = {1, 2, 3}
b = {3, 4, 5}
a ^ b # {1, 2, 4, 5}
a.symmetric_difference(b) # {1, 2, 4, 5}子集 subset
a = {1, 2}
b = {1, 2, 3}
a <= b # True(a是b的子集)
a.issubset(b) # True
a < b # True(a是b的真子集)超集 superset
a = {1, 2, 3}
b = {1, 2}
a >= b # True(a是b的超集)
a.issuperset(b) # True
a > b # True(a是b的真超集)是否不相交
a = {1, 2}
b = {3, 4}
a.isdisjoint(b) # True(没有共同元素)9.4 集合遍历
s = {1, 2, 3}
# 遍历元素
for item in s:
print(item)
# 带索引遍历(用enumerate,但索引没意义)
for i, item in enumerate(s):
print(i, item)注意
集合遍历的顺序是不确定的,不要依赖顺序。
9.5 集合推导式
Python 特色
和列表推导式类似,集合也有推导式。
# 集合推导式
s = {x**2 for x in range(5)}
# {0, 1, 4, 9, 16}
# 带条件
s = {x for x in range(10) if x % 2 == 0}
# {0, 2, 4, 6, 8}
# 自动去重
words = ["hello", "world", "hello", "python"]
s = {len(w) for w in words}
# {5, 6}9.6 集合的常用场景
1. 列表去重
最常用!
列表去重最简单的方法就是转成集合。
lst = [1, 2, 2, 3, 3, 3, 4, 5]
unique_lst = list(set(lst))
print(unique_lst) # [1, 2, 3, 4, 5]注意
转成集合后顺序会丢失,如果需要保持原顺序,要用其他方法。 保持顺序的去重方法见 列表代码片段
2. 快速查找
集合的 in 操作比列表快很多(O(1) vs O(n))
# 大量数据判断是否存在时,用集合
black_list = {"user1", "user2", "user3", ...}
if user in black_list:
...3. 数学集合运算
找共同好友、共同兴趣等:
user1_friends = {"Tom", "Jerry", "Alice"}
user2_friends = {"Tom", "Bob", "Charlie"}
# 共同好友
common = user1_friends & user2_friends # {'Tom'}
# user1的好友中user2没有的
only_user1 = user1_friends - user2_friends # {'Jerry', 'Alice'}9.7 frozenset 不可变集合
frozenset 是不可变的集合,类似元组和列表的关系。
fs = frozenset([1, 2, 3])
print(fs) # frozenset({1, 2, 3})
# 不能修改
# fs.add(4) # ❌ 报错特点:
- 不可变(不能增删改)
- 可以当字典的 key
- 可以作为另一个集合的元素
🔗 相关章节
📝 我的笔记
在这里记录你的理解、疑问和练习代码
# 你的练习代码
✅ 本章检查清单
- 掌握集合的定义和特点
- 掌握集合的增删改查操作
- 会使用集合的数学运算(交并差等)
- 理解集合推导式
- 知道集合的常用场景(去重、快速查找)
- 了解 frozenset 不可变集合