set.intersection()求交集更快,因用哈希表O(1)查找;列表推导若b为list则为O(n×m),需先转set;仅set/frozenset有该方法;多参数直接支持;空参返回空集或原集;小数据差异不显但类型易出错。

用 set.intersection() 求交集比列表推导快得多
当两个集合都较大(比如上万元素)时,set.intersection() 通常比列表推导快 10–100 倍。根本原因不是语法糖,而是底层用了哈希表 O(1) 查找,而 [x for x in a if x in b] 对每个 x 都要线性扫描 b(若 b 是 list)。
- 如果
b是 list,x in b平均耗时 O(len(b)),整段推导是 O(len(a) × len(b)) - 如果
b是 set,x in b是 O(1),但你得先手动转set(b),这步有开销;而set(a).intersection(b)内部会自动选较小集合做遍历,更省 -
intersection()返回新set,不修改原对象;列表推导返回list,类型和可变性不同,别直接替换着用
list 直接套 intersection() 会报错:AttributeError
常见错误是写 my_list.intersection(other_list),结果抛出 AttributeError: 'list' object has no attribute 'intersection'。因为只有 set、frozenset 有这个方法,list 没有。
- 想对列表求交集,必须先转成 set:
set(a).intersection(set(b)) - 如果原始顺序很重要,别只依赖
intersection()—— set 不保序,之后得用[x for x in a if x in set_b](注意:这里set_b = set(b)只转一次) - 含不可哈希元素(如 dict、list)的容器不能转 set,这时只能用列表推导 + 自定义判断逻辑,但性能必然差
多个集合交集:set.intersection() 支持任意数量参数
不用嵌套调用或 reduce,set.intersection() 天然支持多集合: set(a).intersection(b, c, d) 等价于 a ∩ b ∩ c ∩ d。
- 所有参数都会被隐式转为 set(只要支持迭代),包括 list、tuple、range,甚至另一个
set实例 - 空参数调用
set().intersection()返回空 set;但set(a).intersection()(无参数)返回原 set,行为一致 - 如果其中任一参数是空容器(如
[]或set()),结果一定是空 set,短路生效,不浪费时间遍历其余集合
小数据量下差异不明显,但类型混用容易埋雷
几百个元素时,set.intersection() 和带 set 预处理的列表推导耗时可能相差不到 1ms,看不出优势。这时候反而容易忽略类型问题。
立即学习“Python免费学习笔记(深入)”;
- 函数输入没做类型检查,传进来的可能是 list、tuple、pd.Series、np.ndarray ——
intersection()只接受可迭代对象,但内部转换逻辑不同(例如 np.ndarray 会被当作整体一个元素,除非加.flat) - 字符串是可迭代的:
set('ab').intersection('abc')返回{'a', 'b'},不是你想的“字符串整体匹配” - None、NaN、+0.0/-0.0 这类值在 set 中去重行为特殊,交集结果可能不符合直觉,调试时得打出来看实际元素










