Python列表中的交集

时间:2014-04-08 21:17:47

标签: python list intersection

我是Python的新手。我有这个清单:

a = [[0,1,2,3],[4,5,6,7,8,9], ...]
b = [[0,6,9],[1,5], ...]

a& b可以有更多的组件,取决于数据。我想知道这些清单上有没有交叉点?如果有任何交叉点,我想得到这样的结果:

c = [[6,9], ...]

5 个答案:

答案 0 :(得分:2)

Python内置的set类型本身支持交集。但请注意,set只能容纳每个元素中的一个(如数学集)。如果您想要保留每个元素中的多个元素,请尝试collections.Counter

您可以使用set表示法制作{}(如字典,但没有值):

>>> a = {1, 2, 3, 4, 5}
>>> b = {2, 4, 6, 8, 10}

您可以使用&运算符与它们相交:

>>> print a & b
set([2, 4])

答案 1 :(得分:1)

首先,在您的示例代码中,这不是元组,它是一个列表(原始问题询问列表,但是示例代码中引用了元组)。

要获得两个元组或列表的交集,请使用如下代码:

set((1,2,3,4,5)).intersection(set((1,2,3,7,8)))

答案 2 :(得分:1)

在一行中:

common_set = set([e for r in a for e in r])&set([e for r in b for e in r])

或者更容易:

common_set = set(sum(a,[])) & set(sum(b,[]))

Common将是一套。您可以轻松地将设置转换为您需要的列表:

common_list = list(common_set)

答案 3 :(得分:1)

鉴于交集是两组之间的操作,并且您已经给出了两个列表列表,因此您不清楚自己在寻找什么。你想要[1]和b [0]的交集吗?你想要每种可能的组合的交集吗?

我猜你想要两个名单之间两组的每个组合的交集,这将是:

from itertools import product
[set(x).intersection(set(y)) for x, y in product(a, b)]

答案 4 :(得分:0)

另一种方法...假设您想要展平列表的交集。

>>> from itertools import chain

>>> a = [[0,1,2,3],[4,5,6,7,8,9]]
>>> b = [[0,6,9],[1,5]]

>>> list(set(chain(*a)).intersection(set(chain(*b))))
[0, 9, 5, 6, 1]