Python-多个列表的交集?

Python-多个列表的交集?,python,list,set,intersection,Python,List,Set,Intersection,我正在使用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] 对于2.4,您可以只定义一个交集函数 def intersect(*d): sets = iter(map(set, d)) result = s

我正在使用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]

对于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])
>>> 
Lambda减少

from functools import reduce #you won't need this in Python 2
l=[[1, 2, 3, 4], [2, 3, 4], [3, 4, 5, 6, 7]]
reduce(set.intersection, [set(l_) for l_ in l])
@用户3917838

很好,很简单,但需要一些铸造使其工作,并给出一个列表作为结果。它应该是这样的:

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]


至少在Python3.4中,您可以使用
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}

或者,使用
numpy.intersect1d
,它不仅可以用于使两个列表相交

虽然有很多人提到过,但我发现
reduce()
特别有用。事实上,Numpy文档建议使用
reduce()
使多个列表相交:

要回答您的问题,只需:

import numpy as np
from functools import reduce
reduce(np.intersect1d,d)

@AaronMcSmooth:如果我这样做,它会给我
属性错误:“list”对象没有属性“intersection”
。“我错过什么了吗?”传说。你必须先把它映射到一个集合。不知何故,我忽略了它们是列表这一事实。之后,您可以将列表(或任何其他iterable)传递到
交叉点
method@AaronMcSmooth:实际上,我不知道为什么,但无论我尝试什么解决方案,我都会遇到这个错误:
TypeError:intersection()只接受一个参数(给定3个)
@Legend。我的答案和MacGuy在python 2.6和3上为我所做的工作。1@Legend. 谢谢你清理我的帖子。但是请记住:“主这样说:”你应该用四个空格缩进。不多也不少。四是你应该缩进的空格数,四是你应该缩进的空格数。你不应该缩进八个,也不应该缩进两个,除非你接着是四个。制表符是魔鬼的苹果!”“不确定这里出了什么问题。”。现在它告诉我:
TypeError:intersection()只接受一个参数(给定2个)
非常感谢+1美元。由于我的Python版本,我无法使用它:(如果
d
变量的长度可能为零,则
集。intersection
函数将引发
TypeError
异常。我建议捕获该异常并返回
集()
(空集)相反,在这种退化的情况下。这比事先检查
d
len
要好,因为它可能是一个生成器。@AaronR:这一点很好,但集合交集的退化解决方案是通用集,而不是空集。因为在python中没有紧凑的方式来表示它,所以引发了一个异常(可能捕捉到类型错误并提出更合理的建议)可能仍然是正确的处理方法。但是,返回一个空集对于集合并集来说是正确的。@TokenMacGuy:是的,你说得很对;与之类似,它将是唯一一个保证不会改变交集结果的集合。如果你需要一个集合列表,那么说“描述符交集”就失败了n需要集合'
import numpy as np
from functools import reduce
reduce(np.intersect1d,d)