在Python中合并元组列表

3
我需要合并两个元组列表,并得到两个列表之间的某种交集,我已经有了“愚蠢”的解决方案。
列表1在元组的最后一个元素中有不完整的值。
列表2有列表1没有的元组,并且有完整值的元组
结果...嗯 最好用例子来描述:
l1 = [('4',), ('6',)]
l2 = [('3', '1'), ('4', '23'), ('6', '34')]
#我的愚蠢解决方案 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) #预期结果是 -> [('4','23'),('6','34')]
我的问题是: 除了我的愚蠢解决方案外,还有什么其他解决方案?
真的很好奇...
谢谢
4个回答

3

一个列表推导式应该能够解决问题:

result = [ l for l in l2 if (l[0],) in l1]

同样地,你可以使用内置的filter函数。

result = filter(lambda x: (x[0],) in l1, l2)

结果为空列表 - EdChum
1
我的编辑解决了这个问题(需要使用元组比较)。 - jmetz

2
使用 itertools.chain.from_iterable 函数和字典 l2 结合使用更好,因为:
  1. 我们无需生成中间元组/列表。

  2. 由于使用了 dict,我们能够在常数时间内进行查找。


l2 = dict(l2)
from itertools import chain
print [(item, l2.get(item)) for item in chain.from_iterable(l1)]
# [('4', '23'), ('6', '34')]

1

设置查找必须更快:

>>> [ y for y in l2 if y[0] in set(*zip(*l1))]
[('4', '23'), ('6', '34')] 
>>>

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')]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接