Python で複数のリストをループする方法
mo abdelazim
2023年1月30日
このチュートリアルでは、Python で 2つのリスト/タプルを同時に繰り返し処理する方法を説明します。ここでは zip()
と itertools.zip_longest()
を使い、それぞれの違いと使い方を説明します。また、zip()
の戻り値の型が Python 2 と Python 3 でどのように違うのかを見てみましょう。
Python 3.x の zip()
関数
関数 zip()
は複数のリスト/タプルを引数にとり、タプルのイテレータである zip
オブジェクトを返します。
2つのリストを繰り返し処理するには zip()
を使用する
両方のリストを zip()
関数に渡し、for
ループを使用して結果のイテレータを繰り返し処理します。
listA = [1, 2, 3, 4]
listB = [10, 20, 30, 40]
for a, b in zip(listA, listB):
print(a, b)
出力:
1 10
2 20
3 30
4 40
長さの異なる 2つのリストを繰り返し処理するには zip()
を使用する
リストの長さが異なる場合、zip()
は最も短いリストが終了した時点で停止します。以下のコードを参照してください。
listA = [1, 2, 3, 4, 5, 6]
listB = [10, 20, 30, 40]
for a, b in zip(listA, listB):
print(a, b)
出力:
1 10
2 20
3 30
4 40
itertools.zip_longest()
を用いて二つのリストを繰り返し処理する
長い方のリストが終わるまで 2つのリストを繰り返し処理する必要がある場合は、itertools.zip_longest()
を使用します。この関数は zip()
関数と同じように動作しますが、最長のリストが終了すると停止します。
空の値を None
で埋め、タプルのイテレータを返します。
import itertools
listA = [1, 2, 3, 4, 5, 6]
listB = [10, 20, 30, 40]
for a, b in itertools.zip_longest(listA, listB):
print(a, b)
出力:
1 10
2 20
3 30
4 40
5 None
6 None
デフォルトの fillvalue
は None
であるが、fillvalue
には任意の値を設定することができます。
import itertools
listA = [1, 2, 3, 4, 5, 6]
listB = [10, 20, 30, 40]
for a, b in itertools.zip_longest(listA, listB, fillvalue=0):
print(a, b)
出力:
1 10
2 20
3 30
4 40
5 0
6 0
複数のリストで zip()
を使用する
zip()
とその兄弟関数は、2つ以上のリストを受け付けることができます。
import itertools
codes = [101, 102, 103]
students = ["James", "Noah", "Olivia"]
grades = [65, 75, 80]
for a, b, c in itertools.zip_longest(codes, students, grades, fillvalue=0):
print(a, b, c)
出力:
101 James 65
102 Noah 75
103 Olivia 80
Python 2.x の zip()
関数
Python 2.x の zip()
関数も複数のリスト/タプルを引数に受け付けますが、タプルのリストを返します。これは小さなリストであれば問題ありませんが、巨大なリストを持つ場合は、タプルのイテレータを返すので、代わりに itertools.izip()
を使用するべきです。
二つのリストを繰り返し処理するには itertools.izip()
を使用する
import itertools
listA = [1, 2, 3, 4]
listB = [10, 20, 30, 40]
for a, b in itertools.izip(listA, listB):
print(a, b)
出力:
1 10
2 20
3 30
4 40