我有一个集合列表:
setlist = [s1,s2,s3...]
我想要s1∩s2∩s3…
我可以写一个函数,通过执行一系列成对的s1.intersection(s2),等等。
是否有推荐的、更好的或内置的方法?
我有一个集合列表:
setlist = [s1,s2,s3...]
我想要s1∩s2∩s3…
我可以写一个函数,通过执行一系列成对的s1.intersection(s2),等等。
是否有推荐的、更好的或内置的方法?
当前回答
我认为最简单的做法是:
#assuming three sets
set1 = {1,2,3,4,5}
set2 = {2,3,8,9}
set3 = {2,10,11,12}
#intersection
set4 = set1 & set2 & set3
Set4将是set1, set2, set3的交集,并包含值2。
print(set4)
set([2])
其他回答
这里我提供了一个多集交集的通用函数,试图利用可用的最佳方法:
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:])
Guido可能不喜欢减少,但我有点喜欢它:)
Jean-François Fabre set. intection (*list_of_sets)的答案绝对是最python的,也是正确的被接受的答案。
对于那些想要使用reduce的人,以下也可以:
减少(set.intersection list_of_sets)
从Python 2.6版起,你可以使用多个参数来set.intersection(),比如
u = set.intersection(s1, s2, s3)
如果集合在列表中,则转换为:
u = set.intersection(*setlist)
*a_list是列表展开
请注意,set.intersection不是一个静态方法,但它使用函数符号来应用第一个集合与列表其余部分的交集。如果参数列表为空,就会失败。
显然set.intersection是你想要的,但如果你需要一般化的“取所有这些的和”,“取所有这些的乘积”,“取所有这些的xor”,你要找的是reduce函数:
from operator import and_
from functools import reduce
print(reduce(and_, [{1,2,3},{2,3,4},{3,4,5}])) # = {3}
or
print(reduce((lambda x,y: x&y), [{1,2,3},{2,3,4},{3,4,5}])) # = {3}
我认为最简单的做法是:
#assuming three sets
set1 = {1,2,3,4,5}
set2 = {2,3,8,9}
set3 = {2,10,11,12}
#intersection
set4 = set1 & set2 & set3
Set4将是set1, set2, set3的交集,并包含值2。
print(set4)
set([2])