Python集合Set的交集与并集操作方法详解

晚来风
晚来风
发布时间:2026-10-12| 1人浏览过
原创

本文详细讲解Python中集合(set)与冻结集合(frozenset)的交集与并集操作。通过实例演示 intersection()、& 运算符求交集,以及 union()、| 运算符求并集的标准写法,同时说明 intersection_update() 与 update() 的原地修改特性,以及与其他数据类型运算时的隐式转换规则与注意事项。

集合交并集的核心逻辑

数学中的集合概念在 Python 中被转化为内置的数据类型。集合主要用于处理元素去重以及快速判断成员关系,其核心运算集中在交集(共同元素)与并集(全部元素)。掌握这些操作能有效简化数据比对任务。

Python集合交集与并集概念示意图
集合的交集(重叠区域)与并集(整体覆盖区域)直观示意

一、获取集合交集的方法

第1步:使用 intersection() 方法计算交集

intersection() 是最标准的交集查询方式。调用方与被调用方的数据类型决定了返回结果的类型:可变集合(set)调用返回 set,不可变冻结集合(frozenset)调用则返回 frozenset。

set_a = {'name', 18, 'python2', 'abc'}
set_b = frozenset({'name', 19, 'python3', 'abc'})

# 可变集合调用
res1 = set_a.intersection(set_b)
print(res1, type(res1))

# 冻结集合调用
res2 = set_b.intersection(set_a)
print(res2, type(res2))

{'abc', 'name'} <class 'set'>
frozenset({'abc', 'name'}) <class 'frozenset'>

第2步:使用 & 运算符求交集

对于不支持原地修改的场景,可以直接使用位运算符 & 替代方法调用。该运算符的计算顺序同样遵循“左值决定返回值类型”的规则,即运算符左侧的对象类型决定最终结果的集合类型。

set_c = {'name', 18, 'python2', 'abc'}
set_d = frozenset({'name', 19, 'python3', 'abc'})

# set 在左侧,结果为 set
res3 = set_c & set_d
# frozenset 在左侧,结果为 frozenset
res4 = set_d & set_c

第3步:使用 intersection_update() 原地更新交集

⚠️ 风险提示:此方法会直接修改原始集合对象,丢弃非交集元素,且intersection_update()没有返回值。该方法仅适用于可变集合(set),对冻结集合(frozenset)调用会触发 AttributeError。

original_set = {'name', 18, 'python2', 'abc'}
target_frozenset = frozenset({'name', 19, 'python3', 'abc'})

# 仅支持可变集合
original_set.intersection_update(target_frozenset)
print(original_set)  # 直接输出被修改后的对象
# target_frozenset.intersection_update(original_set)  # 此处会报错

第4步:与其他可迭代对象求交集的规则

当 intersection() 的参数不是集合类型时,Python 会将其自动转换为集合后再进行比对。需要注意的是,字符串会被拆解为字符集合,字典会被提取键名集合,而列表和元组则按内部元素逐一对比。

source = {'name', 18, 'python', 'abc', 'p'}
print(source.intersection('python'))       # {'p'}(字符串转为{'y','t','p','o','n','h'}取交集)
print(source.intersection([1, 2, 3, 18]))  # {18}
print(source.intersection((1, 2, 3, 18)))  # {18}
print(source.intersection({'name': 'A', 'age': 18})) # {'name'}

二、获取集合并集的方法

第1步:使用 union() 方法合并并集

使用 union() 可以将多个集合的元素合并为一个新集合,原对象保持不变。该方法同样接受任意数量的参数。

base = {'name', 18, 'python2', 'abc'}
extend = {'name', 19, 'python3', 'abc'}
merged = base.union(extend)
print(merged, type(merged))

第2步:使用 | 运算符合并并集

竖线 | 是 union() 的语法糖,执行效率相当,且始终返回一个新的集合对象,不会改变参与运算的原始集合。

combined = base | extend
print(combined, type(combined))

第3步:使用 update() 原地扩展并集

⚠️ 风险提示:与 intersection_update() 类似,update() 会永久性地往当前集合中添加新元素,属于原地破坏性操作,无返回值,仅作用于可变集合。

target_set = {'name', 18, 'python2', 'abc'}
add_data = {'name', 19, 'python3', 'abc'}

target_set.update(add_data)
print(target_set, type(target_set))

三、总结与最佳实践

在日常数据处理中,推荐使用 & 和 | 进行不可变的交集与并集筛选,代码更为简洁直观;若业务逻辑明确需要就地更新数据集,再调用对应的 _update() 或 update() 方法。遇到其他类型参数时,务必留意 Python 自动转集成的隐式行为,避免因数据结构差异导致预期外的比对结果。

以上就是 Python集合 Set 的交集和并集操作方法详解的详细内容,更多关于 Python集合与数据结构优化的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。