优先用 set.intersection(),因其支持任意可迭代对象且更灵活;& 要求操作数均为 set 类型,否则报 typeerror。

用 set.intersection() 还是 &?效果一样,但行为有差别
两者结果完全一致,但 intersection() 更灵活,& 要求所有操作数都是 set 类型。
-
&是中缀运算符,左右两边都必须是set,否则抛TypeError: unsupported operand type(s) -
intersection()可以接受任意可迭代对象(list、tuple、dict键视图等),内部自动转为set再计算 - 多个集合交集时:
s1 & s2 & s3清晰;s1.intersection(s2, s3)更易读且支持非set参数
传入非 set 时,intersection() 自动处理,& 直接报错
这是最常踩的坑:以为 [1,2,3] & {2,3,4} 能运行,实际会崩。
- 错误示例:
[1,2,3] & {2,3,4}→TypeError: unsupported operand type(s) for &: 'list' and 'set' - 正确写法:
{1,2,3}.intersection([2,3,4])✅ 返回{2, 3} - 注意:
intersection()对dict默认作用于键(d.keys()),不是值;要交值得显式写.intersection(d.values())
性能差异小,但多参数场景下 intersection() 更稳
单次双集合交集,两者底层调用几乎相同,性能无感。但带条件或动态参数时,intersection() 更可靠。
- 想对一个列表和若干集合求交?
s.intersection(*list_of_sets)可行;s & *list_of_sets语法错误 - 需要兼容
None或空参数?s.intersection(*(filters or []))安全;用&就得先过滤、拼接表达式 - Python 3.9+ 支持
set的|、&、-等运算符与frozenset混用,但普通set和frozenset用&没问题,用intersection()也 OK,无需额外转换
别忽略空集合和不可哈希元素的连锁反应
交集结果为空本身不危险,但上游含不可哈希对象(如 dict、list)会导致 intersection() 中途失败,而你可能只看到最后的 TypeError。
立即学习“Python免费学习笔记(深入)”;
- 错误源头常被掩盖:比如
my_set.intersection(data)报unhashable type: 'list',其实是data里混了[1,2]这种元素,不是交集逻辑的问题 - 空集合参与交集:任何集合与空集交都是空集,
{1,2} & set()→set(),没问题;但set().intersection()返回空集,不是None - 如果数据源不确定是否含嵌套结构,先做类型清洗比硬套
intersection()更稳妥










