列出的常见元素我列出的两个列表:如何获得两个列表,其本身在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']]
。我怎样才能做到这一点?
列出的常见元素我列出的两个列表:如何获得两个列表,其本身在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']]
。我怎样才能做到这一点?
考虑的问题,你的澄清评论,像这样做:
转换列表中的一个集合(对于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]]
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])
假设内部元素将始终以相同的顺序。
out = set(map(tuple, l1)).intersection(map(tuple, l2))
set([(1, 'a'), (3, 1), (1, 4)])
注意上面返回一个元组,而不是名单。但是,如果需要的话,你可以轻松地将它们转换回列表:
map(list, out)
如果列表中可以包含重复项,并且结果顺序无关紧要,并且可能对任何使用此问题的人有帮助,这是一个很好的答案。 – timgeb
没有关系吗? – timgeb
应该保留重复吗? – gil
@timgeb如果您指的是每个子列表中元素的顺序,那么是的。 – sodiumnitrate