2つのリストを並行して反復処理するには?
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
*1つの方法は、インデックスを反復することです。
for i in xrange(len(foo)):
print "f: ", foo[i], "; b: ", b[i]
しかし、これは私にはやや不自然に思えます。もっと良い方法はありますか?
758
3
Python 3
zip
はfoo
またはbar
の短い方が停止すると停止します。Python 3**では、
zip
は Python2 のitertools.izip
のようにタプルのイテレータを返します。 タプルのリストを取得するには タプルのリストを得るには、list(zip(foo, bar))
を使います。そして、両方のイテレータがなくなるまで zip を実行するには また、両方のイテレータがなくなるまで zip を実行するには、次のようにします。 itertools.zip_longestを使用します。Python 2
Python 2**では、
zip
はタプルのリストを返します。これはfoo
とbar
が巨大でない場合には良いことです。両者が巨大な場合、zip(foo,bar)
を形成することは不必要に巨大な一時変数であり 一時的な変数であり、itertools.izip
やitertools.izip_
で置き換える必要があります。 これはリストではなくイテレータを返します。izip
はfoo
またはbar
のどちらかが枯渇したときに停止します。izip_longest
はfoo
とbar
の両方が使い果たされたときに停止します。 短い方のイテレータを使い切ると、izip_longest
はそのイテレータに対応する位置にNone
を持つタプルを生成します。必要に応じて、None
以外の別のfillvalue
を設定することもできます。詳しい話]1はこちらをご覧ください。また、
zip
とそのzip
的なものは、任意の数のイテレートを引数として受け入れることができることに注意してください。たとえば、以下のようになります。プリント
zip」機能が欲しい。
zip]1'関数を使用する必要があります。以下は、独自のZIP関数の例です。