反復可能オブジェクトが 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)
zip
foo
またはの短い方がbar
停止すると停止します。
Python 3では、zip
Python2のようにタプルのイテレータを返しますitertools.izip
。タプルのリストを取得するには、を使用しますlist(zip(foo, bar))
。また、両方のイテレータがなくなるまで圧縮するには、次のようにします。itertools.zip_最長。
Python 2
Python 2では、zip
はタプルのリストを返します。foo
と がbar
大規模でない場合は問題ありません。 が両方とも大規模な場合、 は不必要に大規模な一時変数であるため、リストの代わりにイテレータを返すまたはに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
と の両方が尽きると停止しますfoo
。bar
短い方のイテレータが尽きると、そのイテレータに対応する位置にあるizip_longest
タプルを生成します。必要に応じて、別のbesidesNone
を設定することもできます。fillvalue
None
全文。
また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