找到多个集合交集的最佳方法是什么?

398 投票
7 回答
266306 浏览
提问于 2025-04-15 21:00

我有一个集合的列表:

setlist = [s1,s2,s3...]

我想要计算 s1 和 s2 以及 s3 的交集,也就是它们共同拥有的元素。

我可以写一个函数,通过一系列的两两交集操作,比如 s1.intersection(s2),来实现这个功能。

有没有更好的方法,或者是内置的方式可以做到这一点呢?

7 个回答

35

显然,set.intersection 是你在这里想要的功能,但如果你将来需要一个更通用的方式来处理“把这些加起来”、“把这些乘起来”、“把这些做异或运算”,那么你需要用到 reduce 函数:

from operator import and_
from functools import reduce
print(reduce(and_, [{1,2,3},{2,3,4},{3,4,5}])) # = {3}

或者

print(reduce((lambda x,y: x&y), [{1,2,3},{2,3,4},{3,4,5}])) # = {3}
99

从2.6版本开始,set.intersection可以接受任意数量的可迭代对象。

>>> s1 = set([1, 2, 3])
>>> s2 = set([2, 3, 4])
>>> s3 = set([2, 4, 6])
>>> s1 & s2 & s3
set([2])
>>> s1.intersection(s2, s3)
set([2])
>>> sets = [s1, s2, s3]
>>> set.intersection(*sets)
set([2])
655

从Python 2.6版本开始,你可以在使用set.intersection()的时候,传入多个参数,比如:

u = set.intersection(s1, s2, s3)

如果这些集合放在一个列表里,那么可以这样写:

u = set.intersection(*setlist)

这里的*a_list是指列表展开的用法。

需要注意的是,set.intersection并不是一个静态方法,而是用函数的方式来将第一个集合与列表中的其他集合进行交集运算。所以如果传入的参数列表是空的,这个操作就会失败。

撰写回答