Python - 两个列表列表的交集

时间:2016-01-30 11:08:48

标签: python list intersection

这是我的两个清单;

k = [[1, 2], [4], [5, 6, 2], [1, 2], [3], [4], [5,9]]
kDash = [[1, 2], [4], [5, 6, 2], [1, 2], [3], [4], [5,6], [1,2]]

我的输出应该是以下内容;

[[1, 2], [4], [5, 6, 2], [1, 2], [3], [4]]

我怎样才能获得此输出?

提前谢谢

4 个答案:

答案 0 :(得分:4)

您必须将列表转换为元组列表,然后使用交集。请注意,下面的解决方案可能有不同顺序的元素,并且重复显然不会存在,因为我正在使用set。

In [1]: l1 = [[1, 2], [4], [5, 6, 2], [1, 2], [3], [4], [5,9]]

In [2]: l2 = [[1, 2], [4], [5, 6, 2], [1, 2], [3], [4], [5,6], [1,2]]

In [3]: [list(x) for x in set(tuple(x) for x in l1).intersection(set(tuple(x) for x in l2))]
Out[3]: [[1, 2], [5, 6, 2], [3], [4]]

您也可以将变量保存在变量中并获取最终列表,如果是订单,则需要重复:

In [4]: intersection = set(tuple(x) for x in l1).intersection(set(tuple(x) for x in l2))

In [5]: [x for x in l1 if tuple(x) in intersection]
Out[5]: [[1, 2], [4], [5, 6, 2], [1, 2], [3], [4]]

和十字路口,万一你感兴趣。

In [6]: print intersection
set([(1, 2), (5, 6, 2), (3,), (4,)])

这对于大型列表非常有用,但是如果列表很小,请通过@timegb探索其他解决方案(对于更长的列表,其解决方案将非常不理想)

答案 1 :(得分:3)

由于您的输出列表包含重复元素,因此您似乎并不需要经典交集。基本的列表理解将完成所有事情。

>>> k = [[1, 2], [4], [5, 6, 2], [1, 2], [3], [4], [5,9]]
>>> kDash = [[1, 2], [4], [5, 6, 2], [1, 2], [3], [4], [5,6], [1,2]]
>>> [x for x in k if x in kDash]
[[1, 2], [4], [5, 6, 2], [1, 2], [3], [4]]

对于大型列表,我们希望获得将__contains__调用O(1)而不是O(n)所需的时间:

>>> stuff_in_kDash = set(map(tuple, kDash))
>>> [x for x in k if tuple(x) in stuff_in_kDash]
[[1, 2], [4], [5, 6, 2], [1, 2], [3], [4]]

答案 2 :(得分:2)

编写交集的更简洁方法是

{tuple(x) for x in l1} & {tuple(x) for x in l2}

一个很好的选择是

{tuple(x) for x in l1}.intersection(map(tuple, l2))

答案 3 :(得分:0)

即使这里写的是更优雅的解决方案,这里还有另一个

https