2012-05-15 55 views
3

我有元組的兩份名單,例如:如何壓縮元組的兩個列表在python

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

,併合併爲「合併」名單後,我試着「拉鍊」和「地圖」不適合這種情況。

+0

有沒有可能'a'和'b'可能會按不同順序排列,比如'[(7,8,9),(4,5,6),(1,2,3)]'和' (7, 'C'),(1, 'A'),(4, 'b')]' – alan

回答

5
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這是返回合併列表的最快解決方案。

7
>>> 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]] 
0
[ (x,y,z,b[i][1]) for i,(x,y,z) in enumerate(a) if x == b[i][0] ] 

這可確保值匹配,然後合併。

相關問題