Python - 多个列表的交叉?

时间:2010-10-04 04:12:20

标签: python list set intersection

我正在使用python并且能够得到两个列表的交集:

result = set(a).intersection(b)

现在,如果d是包含ab以及第三个元素c的列表,是否有内置函数可用于查找所有三个元素的交集d内的列表?例如,

d = [[1,2,3,4], [2,3,4], [3,4,5,6,7]]

然后结果应该是

[3,4]

6 个答案:

答案 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)