我需要合并两个元组列表,预期结果是两个列表之间的某种交集,我已经有了 DUMB 解决方案。
列表1在元组的最后一个元素中具有不完整的值
列表2包含列表1没有的元组,并且具有完整值的元组
结果...嗯
好吧,最好在例子中描述:
l1 = [('4',), ('6',)] l2 = [('3', '1'), ('4', '23'), ('6', '34')] #my dumb solution def mymerge(l1,l2): l3 = [] for x in l2: if x[0] in [ y[0] for y in l1 ]: l3.append(x) return l3 result = mymerge(l1,l2) #result is what expected-> [('4','23'),('6','34')]
我的问题:
除了我愚蠢的解决方案之外,还有什
非常好奇...
TNX
答案 0 :(得分:3)
list comprehension
应该有效:
result = [ l for l in l2 if (l[0],) in l1]
同样,您可以使用内置的filter
功能
result = filter(lambda x: (x[0],) in l1, l2)
答案 1 :(得分:2)
将itertools.chain.from_iterable
与l2
一起用作字典会更好,因为
我们不必生成中间元组/列表
我们将能够在恒定时间内进行查找,因为我们正在使用dict
。
l2 = dict(l2)
from itertools import chain
print [(item, l2.get(item)) for item in chain.from_iterable(l1)]
# [('4', '23'), ('6', '34')]
答案 2 :(得分:1)
设置查找必须更快:
>>> [ y for y in l2 if y[0] in set(*zip(*l1))]
[('4', '23'), ('6', '34')]
>>>
答案 3 :(得分:0)
In [47]: l1 = [('4',), ('6',)]
In [48]: l2 = [('3', '1'), ('4', '23'), ('6', '34')]
In [49]: la = [l[0] for l in l1]
In [50]: la
Out[50]: ['4', '6']
In [51]: [l for l in l2 if l[0] in la]
Out[51]: [('4', '23'), ('6', '34')]