2016-01-30 25 views
5

这是我的两个列表的两个列表的交集;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]] 

我怎样才能达到这个输出?

预先感谢您

+0

我发现的是,无法列表的列表转换为一组,如果这是可能的这个路口可以很容易地采取问题 –

+0

请解释获得输出的逻辑。 – timgeb

+0

你能解释为什么'[5,6]'和'[5,9]'在交叉点吗? – NiziL

回答

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)

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]] 
+0

如果你需要删除重复的元素,你可以看看[这个答案](http://stackoverflow.com/questions/2213923/python-removing-duplicates -from-A-列表的-列表); – NiziL

+1

此)会比'set'交点方法慢*很多*。缩放类似于'O(n²k)',其中'n'是子列表的数量,'k'是每个子列表的平均长度。 – Veedrac

+0

我刚刚意识到OPs输出列表中有重复的元素。因此,除非规格发生变化,否则清单组合是最好的选择。 – timgeb

2

写相交处的清洁方法是

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

一个很好的选择是

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

即使什么在这里写的是更优雅的解决方案,这里有另外一个

def foo(L1,L2): 
    res=[] 
    for lst in L1: 
     if lst in L2: 
      res.append(lst) 
    return res