Python列表的交集

2 投票
5 回答
783 浏览
提问于 2025-04-18 01:55

我刚开始学习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

还有一种方法可以做到这一点……假设你想要的是扁平化列表的交集。

>>> 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]
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)
1

首先,在你的示例代码中,这不是一个元组,而是一个列表(原问题是问列表,但示例代码中提到了元组)。

要获取两个元组或列表的交集,可以使用这样的代码:

set((1,2,3,4,5)).intersection(set((1,2,3,7,8)))
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

既然交集是两个集合之间的操作,而你给了两个列表的列表,具体你想要什么其实不太清楚。你是想要a[1]和b[0]的交集吗?还是想要所有可能组合的交集呢?

我猜你是想要这两个列表中每一对集合的交集,也就是:

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

撰写回答