如何在Python中压缩两个元组列表

4

我有两个元组列表,例如:

a = [(1,2,3),(4,5,6),(7,8,9)]
b = [(1,'a'),(4,'b'),(7,'c')]

每个元组中a和b的第一个元素是匹配的,我想要得到这样的列表:
merged = [(1,2,3,'a'),(4,5,6,'b'),(7,8,9,'c')]

也许我会再有另一个类似的列表,例如:
c = [(1,'xx'),(4,'yy'),(7,'zz')]

将它合并到“merged”列表中,稍后处理。我尝试使用“zip”和“map”,但这些方法都不适用于此情况。

1
aе’Ңbзҡ„йЎәеәҸеҸҜиғҪдёҚеҗҢеҗ—пјҢдҫӢеҰӮ[(7,8,9),(4,5,6),(1,2,3)]е’Ң[(7,'c'),(1,'a'),(4,'b')]пјҹ - alan
4个回答

8
>>> a = [(1,2,3),(4,5,6),(7,8,9)]
>>> b = [(1,'a'),(4,'b'),(7,'c')]
>>> 
>>> [x + (z,) for x, (y, z) in zip(a, b)]
[(1, 2, 3, 'a'), (4, 5, 6, 'b'), (7, 8, 9, 'c')]

检查第一个元素是否实际匹配,

>>> [x + y[1:] for x, y in zip(a, b) if x[0] == y[0]]

6
def merge(a,b):
    for ax, (first, bx) in zip(a,b):
        if ax[0] != first:
            raise ValueError("Items don't match")
        yield ax + (bx,)

print list(merge(a,b))
print list(merge(merge(a,b),c))

1
>>> [a[i]+(k,) for i,(j, k) in enumerate(b)]
[(1, 2, 3, 'a'), (4, 5, 6, 'b'), (7, 8, 9, 'c')]

使用timeit,这是发布的解决方案中返回合并列表最快的方法。


0
[ (x,y,z,b[i][1]) for i,(x,y,z) in enumerate(a) if x == b[i][0] ]

这样可以确保值匹配并合并。


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