Python3 入门教程
集合
本教程共 70 篇 · 第 15 篇 · 更新于 2026-07-22 · 约 2 分钟阅读
PythonPython3 入门教程集合set集合运算去重
15. 集合
本节目标:掌握集合的创建、运算和应用场景,利用它去重和高效判断成员。
集合是什么
集合(set)是无序、不重复的元素集合。跟数学里的集合概念一样。
>>> s = {1, 2, 3, 3, 3}
>>> s
{1, 2, 3} # 重复元素自动去重
Note集合和字典都用花括号,但集合只有值没有键:
{1, 2, 3}是集合,{"a": 1}是字典。空花括号{}表示空字典,空集合必须用set()。
创建集合
s1 = {1, 2, 3} # 字面量
s2 = set([1, 2, 3]) # 从列表创建
s3 = set("hello") # {'h', 'e', 'l', 'o'}
s4 = set() # 空集合
Warning集合的元素必须是不可变类型。列表、字典不能当集合元素,元组可以:
>>> s = {(1, 2), (3, 4)} # 合法 >>> s = {[1, 2], [3, 4]} # TypeError
增删元素
>>> s = {1, 2, 3}
>>> s.add(4) # 添加元素
>>> s
{1, 2, 3, 4}
>>> s.remove(2) # 删除,不存在会报错
>>> s.discard(99) # 删除,不存在不报错
>>> s.pop() # 随机删除并返回一个元素
>>> s.clear() # 清空
集合运算
这是集合最强大的地方。
并集、交集、差集、对称差集
>>> a = {1, 2, 3, 4}
>>> b = {3, 4, 5, 6}
# 并集:在 a 或 b 中的元素
>>> a | b
{1, 2, 3, 4, 5, 6}
>>> a.union(b)
{1, 2, 3, 4, 5, 6}
# 交集:同时在 a 和 b 中的元素
>>> a & b
{3, 4}
>>> a.intersection(b)
{3, 4}
# 差集:在 a 中但不在 b 中的元素
>>> a - b
{1, 2}
>>> a.difference(b)
{1, 2}
# 对称差集:只在 a 或只在 b 中的元素
>>> a ^ b
{1, 2, 5, 6}
>>> a.symmetric_difference(b)
{1, 2, 5, 6}
子集和超集
>>> a = {1, 2}
>>> b = {1, 2, 3, 4}
>>> a.issubset(b) # a 是否是 b 的子集
True
>>> b.issuperset(a) # b 是否是 a 的超集
True
>>> a.isdisjoint({3, 4}) # 是否没有共同元素
True
集合推导式
>>> {x**2 for x in range(10)}
{0, 1, 4, 81, 64, 9, 16, 49, 25, 36}
>>> {x for x in range(20) if x % 2 == 0}
{0, 2, 4, 6, 8, 10, 12, 14, 16, 18}
Tip集合是无序的,输出顺序每次可能不同。如果顺序重要,用列表或
dict.fromkeys()保序去重。
去重:最实用的场景
集合最常见的用途是去重:
>>> nums = [1, 2, 2, 3, 3, 3]
>>> list(set(nums))
[1, 2, 3]
如果需要保持原顺序,用 dict.fromkeys()(Python 3.7+ 字典保序):
>>> list(dict.fromkeys(nums))
[1, 2, 3]
判断成员效率
集合判断成员的速度远快于列表:
import time
# 构造大数据
big_list = list(range(1000000))
big_set = set(big_list)
# 列表查找
start = time.time()
999999 in big_list
print(f"列表: {time.time() - start:.4f}s")
# 集合查找
start = time.time()
999999 in big_set
print(f"集合: {time.time() - start:.4f}s")
集合查找是 O(1),列表是 O(n)。数据量越大,差距越明显。
Tip如果有一大堆数据,只需要判断「在不在」,或者频繁去重,用集合。如果既要查又要按顺序遍历,权衡一下场景再选。
frozenset:不可变集合
集合是可变的,不能当字典的键。frozenset 是不可变版本:
>>> fs = frozenset([1, 2, 3])
>>> d = {fs: "value"} # 可以当字典键
>>> fs.add(4)
AttributeError: 'frozenset' object has no attribute 'add'
frozenset 支持所有查询和集合运算,但不能增删元素。
来源:参考了 runoob「Python3 集合」、liaoxuefeng「使用 dict 和 set」、w3cschool「Python3 集合」等,改写后所得。