在Python中合并元组列表

3 投票
4 回答
2565 浏览
提问于 2025-04-17 23:57

我需要把两个元组列表合并,期望的结果是这两个列表之间的某种交集。我已经有了一个很简单的解决方案。
列表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')]

我的问题是:除了我这个简单的解决方案,还有什么其他的办法吗?
我真的很想知道……
谢谢

4 个回答

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

当然可以!请把你想要翻译的内容发给我,我会帮你把它变得更简单易懂。

1

设置查找必须更快:

>>> [ y for y in l2 if y[0] in set(*zip(*l1))]
[('4', '23'), ('6', '34')] 
>>>
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')]
3

一个列表推导式应该可以正常工作:

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

同样,你也可以使用内置的过滤函数

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

撰写回答