1

zipPythonで次の操作を実現するための、より簡潔で時間効率の良い方法はありますか? 次のように、リストのリストをペアにして新しいリストを作成しています。

>>> a
[[1, 2, 3], [4, 5, 6]]
>>> b
[[10, 11, 12], [13, 14, 15]]
>>> for x, y in zip(a, b):
...   print zip(*[x, y])
... 
[(1, 10), (2, 11), (3, 12)]
[(4, 13), (5, 14), (6, 15)]

ありがとう。

4

4 に答える 4

6

交換する以外に良い方法はありません:

print zip(*[x, y])

と:

print zip(x,y)

2 つの要素リストを実際に使用している場合は、おそらく次のようにすることができます。

print zip( a[0], b[0] )
print zip( a[1], b[1] )

(zip を 1 つ削除すると、わずかに効率が向上しますが、より明確になるとは思えません。これは、本当に心配する必要があることです)。


あなたが本当にコンパクトなコードに興味があるなら、あなたは使うことができますmap

map(zip,a,b) #[[(1, 10), (2, 11), (3, 12)], [(4, 13), (5, 14), (6, 15)]]

どちらも他のバージョンよりも効率的かもしれませんが、コードの明快さでわずかな代償を払っていると思います (他の人は同意しないかもしれませんが)。

于 2012-10-16T02:29:43.697 に答える
3
>>> [zip(i, j) for i, j in zip(a,b)]
[[(1, 10), (2, 11), (3, 12)], [(4, 13), (5, 14), (6, 15)]]

もちろん、これはあなたが上で書いたものとまったく同じです。

于 2012-10-16T02:34:02.437 に答える
2

@mgilson の発言に加えて、圧縮itertools.izipするリストが大きい場合は、使用を検討することもできます。

要求されたときにのみ要素を計算し、反復子のみを返すため、メモリ使用量は大きなリストizipよりもはるかに少なくなります。zip

于 2012-10-16T02:32:37.603 に答える
1

これもうまくいきます:

print zip(sum(a,[]),sum(b,[]))

プリント:

[(1, 10), (2, 11), (3, 12), (4, 13), (5, 14), (6, 15)]

これはおそらく最高のパフォーマンスであり、簡潔でもあります。

from itertools import chain
print zip(chain(*a),chain(*b))

同じ出力

于 2012-10-16T03:44:09.077 に答える