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

2024-05-16 23:07:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个集合列表:

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

我要s1∩s2∩s3。。。

我可以编写一个函数来执行一系列成对的s1.intersection(s2)等操作

是否有推荐的、更好的或内置的方法?


Tags: 方法函数列表s3内置setlists2s1
3条回答

从2.6开始,set.intersection可以任意多个iterable。

>>> 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])

从Python version 2.6开始,您可以使用多个参数来^{},比如

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

如果集合在列表中,则转换为:

u = set.intersection(*setlist)

其中*a_listlist expansion

注意set.intersection不是静态方法,而是使用函数表示法来应用第一个集合与列表其余部分的交集。因此,如果参数列表为空,这将失败。

显然,这里需要的是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}

相关问题 更多 >