Python-多个列表的交集?
我正在使用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
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)