Python集合Set的交集与并集操作方法详解
本文详细讲解Python中集合(set)与冻结集合(frozenset)的交集与并集操作。通过实例演示 intersection()、& 运算符求交集,以及 union()、| 运算符求并集的标准写法,同时说明 intersection_update() 与 update() 的原地修改特性,以及与其他数据类型运算时的隐式转换规则与注意事项。
集合交并集的核心逻辑
数学中的集合概念在 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集合与数据结构优化的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









