4

たとえば、タプルのリストが 2 つあります。

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

後で「マージ済み」リストにマージします。この場合には不適切な「zip」と「map」を試しました。

4

4 に答える 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]]
于 2012-05-15T10:19:54.650 に答える
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))
于 2012-05-15T10:14:56.890 に答える
1
>>> [a[i]+(k,) for i,(j, k) in enumerate(b)]
[(1, 2, 3, 'a'), (4, 5, 6, 'b'), (7, 8, 9, 'c')]

これを使用timeitすると、投稿されたソリューションの中で最速でマージされたリストが返されます。

于 2012-05-15T10:13:34.013 に答える
0
[ (x,y,z,b[i][1]) for i,(x,y,z) in enumerate(a) if x == b[i][0] ]

これにより、値が一致してからマージされます。

于 2012-05-15T18:04:16.970 に答える