Python - 多个列表的交集?

97 投票
6 回答
98979 浏览
提问于 2025-04-16 04:57

我正在玩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 个回答

12

@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版本中是这样的。

127
set.intersection(*map(set,d))

当然可以!请把你想要翻译的内容发给我,我会帮你把它变得更简单易懂。

65

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

撰写回答