2016-02-23 86 views
0

列出的常见元素我列出的两个列表:如何获得两个列表,其本身在Python

l1 = [[3,1],[1,2],[1,'a'],[1,4]] 
l2 = [[3,1],[1,4],[1,5],[1,'a']] 

,我希望得到他们的交集,即[[3,1],[1,4],[1,'a']]。我怎样才能做到这一点?

+0

没有关系吗? – timgeb

+0

应该保留重复吗? – gil

+0

@timgeb如果您指的是每个子列表中元素的顺序,那么是的。 – sodiumnitrate

回答

1

考虑的问题,你的澄清评论,像这样做:

转换列表中的一个集合(对于O(1 )查找时间),然后使用列表理解。

>>> l2_s = set(map(tuple, l2)) 
>>> [x for x in l1 if tuple(x) in l2_s] 
[[3, 1], [1, 'a'], [1, 4]] 
2
l1 = [[3,1],[1,2],[1,'a'],[1,4]] 
l2 = [[3,1],[1,4],[1,5],[1,'a']] 
intersection = [] 
for x in l1: 
    if x in l2: 
     intersection.append(x) 
print (intersection) 

用于循环查找相同的元素并将它们追加到另一个列表中。

输出;

[[3, 1], [1, 'a'], [1, 4]] 
>>> 

或更短方式,使用列表内涵;

l1 = [[3,1],[1,2],[1,'a'],[1,4]] 
l2 = [[3,1],[1,4],[1,5],[1,'a']] 

print ([x for x in l1 if x in l2]) 
1

假设内部元素将始终以相同的顺序。

out = set(map(tuple, l1)).intersection(map(tuple, l2)) 

输出

set([(1, 'a'), (3, 1), (1, 4)]) 

注意上面返回一个元组,而不是名单。但是,如果需要的话,你可以轻松地将它们转换回列表:

map(list, out) 
+0

如果列表中可以包含重复项,并且结果顺序无关紧要,并且可能对任何使用此问题的人有帮助,这是一个很好的答案。 – timgeb