Python - 多个列表的交叉?

Leg*_*end 51 python intersection list set

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

result = set(a).intersection(b)
Run Code Online (Sandbox Code Playgroud)

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

d = [[1,2,3,4], [2,3,4], [3,4,5,6,7]]
Run Code Online (Sandbox Code Playgroud)

那么结果应该是

[3,4]
Run Code Online (Sandbox Code Playgroud)

Sin*_*ion 66

set.intersection(*map(set,d))
Run Code Online (Sandbox Code Playgroud)

  • 如果变量d的长度可能为零,则set.intersection函数将引发TypeError异常。我建议捕获该异常,然后在那种简并的情况下返回set()(一个空集)。这比事先检查d的len更好,因为它可能是生成器。 (2认同)

aar*_*ing 48

对于2.4,您可以只定义交叉函数.

def intersect(*d):
    sets = iter(map(set, d))
    result = sets.next()
    for s in sets:
        result = result.intersection(s)
    return result
Run Code Online (Sandbox Code Playgroud)

对于较新版本的python:

intersection方法采用任意数量的参数

result = set(d[0]).intersection(*d[:1])
Run Code Online (Sandbox Code Playgroud)

或者,您可以将第一个集合与自身相交,以避免切片并制作副本:

result = set(d[0]).intersection(*d)
Run Code Online (Sandbox Code Playgroud)

我不确定哪个更高效,并且感觉它将取决于d[0]列表的大小和列表的大小,除非python有内置的检查,如

if s1 is s2:
    return s1
Run Code Online (Sandbox Code Playgroud)

在交集方法中.

>>> 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])
>>> 
Run Code Online (Sandbox Code Playgroud)

  • @传说.谢谢你清理我的帖子.但要记住:'这样说主啊:"你要用四个空格缩进.不多也不少.四个是你要缩进的空格数,你的缩进数量应该是四个.八个你不能缩进,也不要缩小你的两个,除了你接着四个.标签是魔鬼的苹果!"' (11认同)

小智 11

@用户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]

至少在 Python 3.4 中


小智 10

您可以使用 获得任意数字集的交集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])  
Run Code Online (Sandbox Code Playgroud)

结果:

{3, 4}
Run Code Online (Sandbox Code Playgroud)