这是我的两个列表的两个列表的交集;Python的 - 名单
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]]
我怎样才能达到这个输出?
预先感谢您
这是我的两个列表的两个列表的交集;Python的 - 名单
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]]
我怎样才能达到这个输出?
预先感谢您
您必须将名单转化为元组的列表,然后使用交集。请注意,以下解决方案可能具有不同顺序的元素,并且重复显然不会存在,因为我正在使用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(其解决方案将是较长的列表高度unoptimal)
其他解决方案,因为你的输出列表有重复的元素,你并不真的想要一个古典的交集。基本的列表理解将会完成所有的事情。
>>> 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]]
写相交处的清洁方法是
{tuple(x) for x in l1} & {tuple(x) for x in l2}
一个很好的选择是
{tuple(x) for x in l1}.intersection(map(tuple, l2))
即使什么在这里写的是更优雅的解决方案,这里有另外一个
def foo(L1,L2):
res=[]
for lst in L1:
if lst in L2:
res.append(lst)
return res
我发现的是,无法列表的列表转换为一组,如果这是可能的这个路口可以很容易地采取问题 –
请解释获得输出的逻辑。 – timgeb
你能解释为什么'[5,6]'和'[5,9]'在交叉点吗? – NiziL