最好的方法来find多个交集?

我有一组列表:

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

我要s1∩s2∩s3…

我可以通过执行一系列成对s1.intersection(s2)等来编写一个函数来完成它。

有推荐的,更好的还是内置的方法?

从Python版本2.6开始,你可以使用多个参数来设置set.intersection()

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

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

 u = set.intersection(*setlist) 

其中*a_list是列表扩展

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

如果你没有Python 2.6或更高版本,可以select编写一个明确的for循环:

 def set_list_intersection(set_list): if not set_list: return set() result = set_list[0] for s in set_list[1:]: result &= s return result set_list = [set([1, 2]), set([1, 3]), set([1, 4])] print set_list_intersection(set_list) # Output: set([1]) 

你也可以使用reduce

 set_list = [set([1, 2]), set([1, 3]), set([1, 4])] print reduce(lambda s1, s2: s1 & s2, set_list) # Output: set([1]) 

然而,许多Python程序员不喜欢它, 包括Guido本人 :

大约12年前,Python收购了lambda,reduce(),filter()和map(),这是我相信一个Lisp黑客错过了他们,并提交了工作补丁。 但是,尽pipePR的价值,我认为这些function应该从Python3000削减。

所以现在reduce()。 这实际上是我一直最讨厌的一个,因为除了几个涉及+或*的例子之外,几乎每次我看到一个带有非平凡函数参数的reduce()函数,我都需要抓笔和纸来在我明白了reduce()应该做什么之前,实际上正在input什么函数。 所以在我看来,reduce()的适用性几乎局限于关联​​运算符,而在所有其他情况下,最好明确地写出累加循环。

明确的设置set.intersection是你想要的,但是如果你需要一个“总结所有这些”的概括,“把所有这些的产品”,“取所有这些的异或”,你在找什么因为是reducefunction:

 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} 

在这里,我提供了一个通用函数,用于多组交集,试图利用可用的最佳方法:

 def multiple_set_intersection(*sets): """Return multiple set intersection.""" try: return set.intersection(*sets) except TypeError: # this is Python < 2.6 or no arguments pass try: a_set= sets[0] except IndexError: # no arguments return set() # return empty set return reduce(a_set.intersection, sets[1:]) 

圭多可能不喜欢reduce ,但我有点喜欢它:)