首页 / Python3 入门教程 / 集合

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 集合」等,改写后所得。