この記事では、Python で多重ループする方法を解説します。
多重ループを使うことで複数のイテラブルを使ってループ処理したり、多次元配列の要素を 1つずつ取り出して処理したりすることができます。
それでは、多重ループの使い方を見ていきましょう!
for
文中 に for
文 を記述することで多重ループさせることができます。
for 変数1 in イテラブル1:
for 変数2 in イテラブル2:
# 処理
以下のコードは、for
文 を2つ重ねた「二重ループ」です。
for i in range(3):
for j in range(3):
print(f'i: {i}, j: {j}')
実行結果
i: 0, j: 0
i: 0, j: 1
i: 0, j: 2
i: 1, j: 0
i: 1, j: 1
i: 1, j: 2
i: 2, j: 0
i: 2, j: 1
i: 2, j: 2
多次元配列は、多重ループを使うことで展開することができます。
l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
for i in l:
for j in i:
print(j)
print()
実行結果
1
2
3
4
5
6
7
8
9
以下のようにアンパックすることでも展開できます。
point = [[1, 2], [3, 4], [5, 6]]
for x, y in point:
print(x, y)
実行結果
1 2
3 4
5 6
どのように値が必要なのかに応じて展開方法を切り替えましょう!
多重ループをネストされた for
文 から break
で中断しようとしても、ネストされた for
文 しか中断することができず、ループ処理が継続してしまいます。
for i in range(3):
for j in range(3):
print(i, j)
if i == 1 and j == 1:
print('break 実行')
break
実行結果
0 0
0 1
0 2
1 0
1 1
break 実行
2 0
2 1
2 2
このような場合は フラグを使う
か elseを使う
ことで解決できます。
以下のように bool
値 を使うことで多重ループを中断することができます。
flag = False
for i in range(3):
for j in range(3):
print(i, j)
if i == 1 and j == 1:
print('break 実行')
flag = True
break
if flag:
break
実行結果
0 0
0 1
0 2
1 0
1 1
break 実行
内側の break
が処理された際、flag
変数 に True
を格納することで外側の break
も処理されます。
else
は break
で中断した場合は処理されません。その性質を利用して内側の for
文 が正常終了した際には else
によって continue
が処理され、外側の break
が実行されないようにしています。
内側の for
文 が break
によって中断された場合は、else
によって continue
が処理されないので、外側の break
が実行される仕組みになっています。
for i in range(3):
for j in range(3):
print(i, j)
if i == 1 and j == 1:
print('break 実行')
break
else:
print('continue 実行')
continue
print('外側のbreak 実行')
break
実行結果
0 0
0 1
0 2
continue 実行
1 0
1 1
break 実行
外側のbreak 実行
itertools
モジュール の product()
関数 を使うことで for文 1つで多重ループと同様の結果を得ることができます。
import itertools
itertools.product(*iterables, repeat=1)
イテラブルを 2つ指定することで 2重ループと同等です。
import itertools
l1 = [1, 2, 3]
l2 = [10, 20, 30]
for v1, v2 in itertools.product(l1, l2):
print(v1, v2)
実行結果
1 10
1 20
1 30
2 10
2 20
2 30
3 10
3 20
3 30
ただし、ネストした for
文 が処理される前後に何かしらの処理をしたい場合は実装が面倒なので通常の for
文 を使った方が楽です。