这是我的两个清单;
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]]
我怎样才能获得此输出?
提前谢谢
答案 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