合并python中的元组列表

时间:2014-03-26 09:20:12

标签: python

我需要合并两个元组列表,预期结果是两个列表之间的某种交集,我已经有了 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

4 个答案:

答案 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_iterablel2一起用作字典会更好,因为

  1. 我们不必生成中间元组/列表

  2. 我们将能够在恒定时间内进行查找,因为我们正在使用dict


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