我正在使用python并且能够得到两个列表的交集:
result = set(a).intersection(b)
现在,如果d
是包含a
和b
以及第三个元素c
的列表,是否有内置函数可用于查找所有三个元素的交集d
内的列表?例如,
d = [[1,2,3,4], [2,3,4], [3,4,5,6,7]]
然后结果应该是
[3,4]
答案 0 :(得分:57)
set.intersection(*map(set,d))
答案 1 :(得分:43)
对于2.4,您只需定义一个交点函数。
def intersect(*d):
sets = iter(map(set, d))
result = sets.next()
for s in sets:
result = result.intersection(s)
return result
对于较新版本的python:
交集方法需要任意数量的参数
result = set(d[0]).intersection(*d[:1])
或者,您可以将第一个集合与自身相交,以避免切片并制作副本:
result = set(d[0]).intersection(*d)
我不确定哪个更高效,并且感觉它将取决于d[0]
的大小和列表的大小,除非python有内置的检查,如
if s1 is s2:
return s1
交叉法中的。
>>> d = [[1,2,3,4], [2,3,4], [3,4,5,6,7]]
>>> set(d[0]).intersection(*d)
set([3, 4])
>>> set(d[0]).intersection(*d[1:])
set([3, 4])
>>>
答案 2 :(得分:6)
您可以使用set.intersection(set1, set2, set3...)
获得任意数字集的交集。因此,您只需要将列表转换为集合,然后将它们传递给此方法,如下所示:
d = [[1,2,3,4], [2,3,4], [3,4,5,6,7]]
set.intersection(*[set(x) for x in d])
结果:
{3, 4}
答案 3 :(得分:4)
@ user3917838
既简单又简单,但需要一些强制转换才能使其正常工作并提供一个列表作为结果。它应该看起来像:
list(reduce(set.intersection, [set(item) for item in d ]))
其中:
d = [[1,2,3,4], [2,3,4], [3,4,5,6,7]]
结果是:
[3, 4]
至少在Python 3.4中
答案 4 :(得分:1)
Lambda reduce。
from functools import reduce #you won't need this in Python 2
reduce(set.intersection, [[1, 2, 3, 4], [2, 3, 4], [3, 4, 5, 6, 7]])
答案 5 :(得分:0)
或者,使用 numpy.intersect1d
,它不仅可以用于将两个列表相交。
虽然很多人都提到过,但我发现 reduce()
特别有用。事实上,Numpy 文档推荐使用 reduce()
来交叉多个列表:numpy.intersect1d reference
要回答您的问题,只需:
import numpy as np
from functools import reduce
reduce(np.intersect1d,d)