1. ホーム
  2. パイソン

[解決済み】2つのリストを並列に反復処理する方法は?

2022-03-23 10:25:33

質問

Pythonで2つの反復記号を持っていて、それらをペアで確認したいのです。

foo = (1, 2, 3)
bar = (4, 5, 6)

for (f, b) in some_iterator(foo, bar):
    print("f: ", f, "; b: ", b)

という結果になるはずです。

f: 1; b: 4
f: 2; b: 5
f: 3; b: 6

の方法は、インデックスを繰り返し処理することです。

for i in range(len(foo)):
    print("f: ", foo[i], "; b: ", bar[i])

でも、それだとなんだかピリッとしないような気がするんです。もっといい方法はないのでしょうか?

解決方法は?

Python 3

for f, b in zip(foo, bar):
    print(f, b)

zip のうち、短い方が停止します。 foo または bar が停止します。

パイソン3 , zip はタプルのイテレータを返します。 itertools.izip Python2では、リストを取得するために を使用すると、タプルの list(zip(foo, bar)) . そして、両方のイテレータが終了するまで を使い果たすと、次のようになります。 itertools.zip_longest .

Python 2

Python 2 , zip はタプルのリストを返します。これは foobar は質量がない。もし両方が質量を持つなら zip(foo,bar) は不必要に巨大な という一時的な変数に置き換える必要があります。 itertools.izip または itertools.izip_longest これはリストの代わりにイテレータを返します。

import itertools
for f,b in itertools.izip(foo,bar):
    print(f,b)
for f,b in itertools.izip_longest(foo,bar):
    print(f,b)

izip のどちらかが停止したとき foo または bar が枯渇した場合。 izip_longest が両方揃うと停止します。 foobar を使い果たす。 短い方のイテレータを使い切ったとき。 izip_longest を持つタプルを生成します。 None をそのイテレータに対応する位置に置く。また、別の fillvalue の他に None を選択します。はこちらをご覧ください。 全文 .


また、次のことにも注意してください。 zip とその zip -のようなbrethenは、引数として任意の数のiterableを受け取ることができます。例えば

for num, cheese, color in zip([1,2,3], ['manchego', 'stilton', 'brie'], 
                              ['red', 'blue', 'green']):
    print('{} {} {}'.format(num, color, cheese))

印刷物

1 red manchego
2 blue stilton
3 green brie