Python PR

【Python】多重ループをする方法

記事内に商品プロモーションを含む場合があります

この記事では、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
for文はいくつでも重ねることが可能ですが、重ねるごとに可読性が下がるので基本的には三重ループぐらいまでしか使いません

多次元配列の展開

多次元配列は、多重ループを使うことで展開することができます。

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

どのように値が必要なのかに応じて展開方法を切り替えましょう!

多重ループのbreak

多重ループをネストされた 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を使う方法

elsebreak で中断した場合は処理されません。その性質を利用して内側の 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()を使う

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文 を使った方が楽です。