Python中用&运算符求两个set交集最直接,它简洁可读、返回新set且不修改原对象;intersection()方法适合多集合或动态参数场景;空集参与结果为空集,需注意布尔判断与内存开销。

用 & 运算符求两个 set 的交集最直接
Python 中 set 原生支持集合运算,& 就是交集操作符,它比调用方法更简洁、可读性更强,且返回新 set,不修改原对象。
- 两个
set都必须是set类型,如果其中一个是list或tuple,会报TypeError: unsupported operand type(s) - 空
set参与运算结果也是空set,比如{1, 2} & set()→set() - 字符串、数字、元组等不可变类型可直接参与;含列表或字典的元素无法加入
set,自然也不能用于交集
示例:{1, 2, 3} & {2, 3, 4} 返回 {2, 3}
intersection() 方法适合多集合交集或动态参数
当需要同时计算 3 个及以上 set 的交集,或者参数来自变量、迭代器时,intersection() 更灵活。它接受任意多个 set 或可迭代对象(自动转 set),但注意:传入非 set 时性能略低,因为内部要做类型转换。
-
s1.intersection(s2, s3, s4)等价于s1 & s2 & s3 & s4,但前者更易扩展 - 传入
list如s1.intersection([2, 3, 4])是合法的,但底层会临时构造set,大数据量时不如提前转好 - 如果传入不可哈希对象(如嵌套列表),会在运行时抛出
TypeError: unhashable type
示例:{1, 2, 3}.intersection([2, 3], {3, 4, 5}) 返回 {3}
立即学习“Python免费学习笔记(深入)”;
交集结果为空时别误判成 False
set() 在布尔上下文中为 False,但交集为空不等于“无意义”——它本身就是一个有效结果。直接用 if s1 & s2: 判断是否有公共元素没问题,但如果后续还需这个空集做进一步操作(比如合并、统计),就别把它丢掉。
- 错误写法:
common = s1 & s2; if not common: return—— 如果你后面还要用common,这行就提前中断了逻辑 - 正确做法:先算交集,再按需分支,比如
if common: do_something(common),否则继续处理空集 - 注意
None和set()是不同值,不能混用;common or default_set这种写法在common为空时会取default_set,要确认是否符合业务意图
性能和内存:交集操作不改变原 set,但新建对象有开销
所有交集操作(& 或 intersection())都返回新 set,原 set 不变。这对并发或函数式风格友好,但也意味着每次调用都分配内存。
- 对超大
set(百万级元素),频繁交集可能触发 GC 或增加延迟,此时可考虑用intersection_update()原地更新(但会改原对象) - 如果只是判断是否存在交集,用
any(x in s2 for x in s1)更省内存,但时间复杂度退化为 O(n),而&是平均 O(min(len(s1), len(s2))) -
frozenset也能用&,但不能用intersection_update()—— 它没有原地方法
真正要注意的是:别在循环里反复计算同一对 set 的交集,缓存结果更实际。


















