Python: for文の直後に2つの変数を指定するケース

Pythonのfor文を書く場合、 「for 変数 in リスト」のようにfor文の直後に変数を記述します。
この時「for 変数1, 変数2 in リスト」と変数の部分に2つ(以上)の変数を 記述することもできます。
この記事では、どのような場合に2変数やそれ以上の変数を記述できるのかを解説します。

for文の仕組み

まずは簡単にfor文の仕組みをおさらいします。

下図にあるように、 for文では繰り返しのたびにリストの要素が順番に変数に代入されます。 (ここでは「イテラブルなオブジェクト」としてリストを例にしています)

for文の仕組み

この時にリストの要素内容がさらにリストやタプルなどのコレクションの場合もあり得ます。 例えば次のような2次元リストの場合です。

[[1, 2], [2, 3], [3, 4]]

このように、大元のリストの要素内容がさらにリストやタプルの場合に、2つ以上の変数を 記述することができます。

アンパック代入

具体的なコードでfor文の後に2変数を取るケースを見ていきます。
次のコードではリスト li の各要素を2つの変数 a, bに代入して表示しています。

li = [[1, 2], [2, 3], [3, 4]]

for a, b in li:
	print(a, b)
	
# 実行結果
1 2
2 3
3 4

リスト liの各要素を変数 a, bに代入する時の様子を コードにすると次のようになります。

a, b = [1, 2]
a, b = [2, 3]
a, b = [3, 4]

リストの要素を分割して各変数に代入しています。 つまり「アンパック代入」しているだけです。

もしリスト liが「[[1, 2, 3], [3, 4, 5]]」だとしたら、 次のコードのように forの後に3つの変数を記述してそれぞれの値を取得することができます。

li = [[1, 2, 3], [3, 4, 5]]

for a, b, c in li:
	print(a, b, c)

# 実行結果
1 2 3
3 4 5

for文の後に2変数をとる例(ディクショナリ)

for文の後に2変数を記述する例として、 ディクショナリ(辞書)のループについて解説します。

ディクショナリには「キー」と「値」があり、 forループで次のように2変数を記述して、 キーと値を別々に取得することができます。

d = {"a": 100, "b": 200}

for k, v in d.items():
	print(k, v)

# 実行結果
a 100
b 200

ポイントはディクショナリのitems()メソッドです。 items()メソッドはディクショナリの要素をリスト化します。 キーと値の組はタプルとして「(キー, 値)」となります。

実際にitems()メソッドを実行すると、 どのようにリスト化されるかを見てみます。

d = {"a": 100, "b": 200}

# items()メソッド
print(d.items())

# 実行結果
dict_items([('a', 100), ('b', 200)])

後は、このタプルを順番にアンパック化するだけなので、 次のコードになります。

for k, v in d.items():
	print(k, v)

このような流れでディクショナリのキーと値を別々に取得することができます。

Python