2つのリストを並列に反復処理するにはどうすればいいですか? 質問する

2つのリストを並列に反復処理するにはどうすればいいですか? 質問する

反復可能オブジェクトが 2 つあり、それらをペアで確認したいと思います。

foo = [1, 2, 3]
bar = [4, 5, 6]

for (f, b) in iterate_together(foo, bar):
    print("f:", f, " |  b:", b)

その結果は次のようになります。

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

これを行う1 つの方法は、インデックスを反復処理することです。

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

しかし、それは私にとっては Python らしくないように思えます。もっと良い方法はあるでしょうか?


関連タスク:
*リストをタプルのリストにマージするにはどうすればいいですか?- 上記fooと が与えられた場合bar、リスト を作成します[(1, 4), (2, 5), (3, 6)]
*キーと値の別々のリストから辞書 (dict) を作成するにはどうすればよいですか?- 辞書を作成します{1: 4, 2: 5, 3: 6}
*理解力のある辞書を作成する-辞書理解でのdict使用を構築します。zip

ベストアンサー1

Python3 について

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

zipfooまたはの短い方がbar停止すると停止します。

Python 3ではzipPython2のようにタプルのイテレータを返しますitertools.izip。タプルのリストを取得するには、を使用しますlist(zip(foo, bar))。また、両方のイテレータがなくなるまで圧縮するには、次のようにします。itertools.zip_最長

Python 2

Python 2ではzipはタプルのリストを返します。fooと がbar大規模でない場合は問題ありません。 が両方とも大規模な場合、 は不必要に大規模な一時変数であるため、リストの代わりにイテレータを返すまたはにzip(foo,bar)置き換える必要がありますitertools.izipitertools.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)

izipfooまたはのいずれかbarが尽きると停止します。izip_longestと の両方が尽きると停止しますfoobar短い方のイテレータが尽きると、そのイテレータに対応する位置にあるizip_longestタプルを生成します。必要に応じて、別のbesidesNoneを設定することもできます。fillvalueNone全文


またzip、 およびそのzip類似の関数は、任意の数の反復可能オブジェクトを引数として受け取ることができることにも注意してください。たとえば、

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

おすすめ記事