精通 Python 集合:创建、操作与集合运算
Python 集合
了解 Python 集合数据类型如何简化数据去重与集合运算。本指南涵盖创建、修改、删除及所有基本集合操作。
视频:Python 中的集合
集合是唯一、不可变项的无序集合。集合本身可变——允许添加或移除元素——但其元素必须可哈希(如数字、字符串、元组)。
Python 集合支持并集、交集、差集、对称差集等数学集合运算,使其成为数据去重、成员测试和集合代数的理想工具。
创建 Python 集合
用花括号或内置 set() 构造函数创建集合。元素可以是任何不可变类型,但列表、字典或其他集合等可变类型不能包含。
# 示例 1:不同数据类型的集合
# 整数集合
my_set = {1, 2, 3}
print(my_set)
# 混合数据类型集合
my_set = {1.0, 'Hello', (1, 2, 3)}
print(my_set)
输出
{1, 2, 3} {1.0, (1, 2, 3), 'Hello'}
注意重复值自动移除,且元组因不可变被接受。
# 移除重复项
my_set = {1, 2, 3, 4, 3, 2}
print(my_set)
# 从列表构建集合
my_set = set([1, 2, 3, 2])
print(my_set)
# 尝试包含可变项会报错
# my_set = {1, 2, [3, 4]} # TypeError: unhashable type: 'list'
输出
{1, 2, 3, 4} {1, 2, 3} Traceback (most recent call last): File "<string>", line 15, in <module> my_set = {1, 2, [3, 4]} TypeError: unhashable type: 'list'
创建空集合需用 set() 构造函数;{} 创建的是空字典。
# 区分创建空结构时的集合与字典
a = {}
print(type(a))
a = set()
print(type(a))
输出
<class 'dict'> <class 'set'>
修改 Python 集合
集合可变,但因无序不支持索引或切片。
用 add() 插入单个元素,update() 合并另一可迭代对象。重复项自动忽略。
# 示例:添加元素
my_set = {1, 3}
print(my_set)
# 尝试索引集合报错
# my_set[0] # TypeError: 'set' object does not support indexing
# 添加单个元素
my_set.add(2)
print(my_set)
# 从列表添加多个元素
my_set.update([2, 3, 4])
print(my_set)
# 合并列表和另一集合
my_set.update([4, 5], {1, 6, 8})
print(my_set)
输出
{1, 3} {1, 2, 3} {1, 2, 3, 4} {1, 2, 3, 4, 5, 6, 8}
从集合移除元素
用 discard() 移除存在的元素,不存在则不报错。相比之下,remove() 在元素缺失时引发 KeyError。
# 示例:discard 对比 remove
my_set = {1, 3, 4, 5, 6}
print(my_set)
my_set.discard(4)
print(my_set)
my_set.remove(6)
print(my_set)
my_set.discard(2)
print(my_set)
# 以下将引发 KeyError
# my_set.remove(2)
输出
{1, 3, 4, 5, 6} {1, 3, 5, 6} {1, 3, 5} {1, 3, 5} Traceback (most recent call last): File "<string>", line 28, in <module> KeyError: 2
pop() 移除并返回任意元素,clear() 清空集合。
# pop 和 clear 示例
my_set = set("HelloWorld")
print(my_set)
print(my_set.pop())
print(my_set)
my_set.clear()
print(my_set)
输出
{'H', 'l', 'r', 'W', 'o', 'd', 'e'} H {'r', 'W', 'o', 'd', 'e'} set()
Python 集合运算
Python 集合支持经典集合代数:并集、交集、差集、对称差集。可通过操作符或专用方法调用。
以两个示例集合为例:
A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}
并集

A 和 B 的并集包含所有不同元素。
print(A | B)
输出
{1, 2, 3, 4, 5, 6, 7, 8}
交集

交集仅返回两集合共有元素。
print(A & B)
输出
{4, 5}
差集

差集 A - B 列出在 A 中但不在 B 中的元素。
print(A - B)
输出
{1, 2, 3}
对称差集

对称差集 A ^ B 返回在任一集合中但不在两者中的元素。
print(A ^ B)
输出
{1, 2, 3, 6, 7, 8}
其他集合方法
以下是集合对象所有内置方法的快速参考:
| 方法 | 描述 |
|---|---|
| add() | 向集合添加元素 |
| clear() | 移除所有元素 |
| copy() | 返回浅拷贝 |
| difference() | 返回调用者有但其他无的元素新集合 |
| difference_update() | 原地差集移除 |
| discard() | 元素存在则移除;不存在不报错 |
| intersection() | 返回公共元素新集合 |
| intersection_update() | 原地交集更新 |
| isdisjoint() | 若集合无共同元素返回 True |
| issubset() | 若调用者是另一集合子集返回 True |
| issuperset() | 若调用者完全包含另一集合返回 True |
| pop() | 移除并返回任意元素;空集合引发 KeyError |
| remove() | 移除元素;缺失引发 KeyError |
| symmetric_difference() | 返回各集合独有元素新集合 |
| symmetric_difference_update() | 原地对称差集更新 |
| union() | 返回包含所有唯一元素的新集合 |
| update() | 与另一可迭代对象原地并集 |
集合成员测试
用 in 关键字检查元素存在性。
my_set = set("apple")
print('a' in my_set) # True
print('p' not in my_set) # False
输出
True False
遍历集合
用标准 for 循环遍历集合;顺序不保证。
for letter in set("apple"):
print(letter)
集合上的内置函数
len()、max()、min()、sum()、all()、any()、sorted() 等函数无缝支持集合。常用工具表:
| 函数 | 描述 |
|---|---|
| all() | 所有元素为真(或集合为空)返回 True |
| any() | 至少一个元素为真返回 True |
| enumerate() | 带索引迭代,便于调试 |
| len() | 元素数量 |
| max() | 最大元素 |
| min() | 最小元素 |
| sorted() | 返回集合排序后的列表 |
| sum() | 所有数值元素求和 |
Python Frozenset
frozenset 是集合的不可变对应物。创建后元素不可变,使其可哈希,可用作字典键。
A = frozenset([1, 2, 3, 4])
B = frozenset([3, 4, 5, 6])
支持操作镜像常规集合,除变异方法外。
print(A.isdisjoint(B))
print(A.difference(B))
print(A | B)
# 尝试添加元素引发 AttributeError
# A.add(3) # AttributeError: 'frozenset' object has no attribute 'add'
Python