Python列表的交集
我刚开始学习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)]