<一覧に戻る

ネストしたループ(入れ子のループ)

Python学習において、ループ処理は欠かせない基本構文です。

その中でもネストしたループ(入れ子構造のループ)は、より複雑な繰り返し処理を行うために非常に重要な考え方です。 ネストとは「入れ子」という意味で、ループの中にさらに別のループを入れることを指します。

ネストしたループの基本

ネストしたループの基本的な動作はとてもシンプルです。 外側のループが1回まわるたびに、内側のループはすべての処理を実行します。

例えば、九九の表を作ったり、二次元配列(リストの中にリストが入っているデータ)を処理したりするときに役立ちます。

サンプルコード1:二次元リストを処理する

まずはシンプルな例として、二次元リストの要素をすべて取り出して表示してみましょう。

# 2次元リストの作成
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

# ネストしたループで各要素を表示
for row in matrix:
    for element in row:
        print(element, end=' ')
    print()  # 行ごとに改行

このコードでは、まず3行3列の二次元リスト"matrix"を用意しています。 外側のfor row in matrixでは、リストの中から1行ずつ取り出して処理します。そして内側のfor element in rowでは、その行の中に含まれている要素を1つずつ取り出して表示しています。

print関数にはend=' 'を指定しているため、各要素は横並びで表示され、行の処理が終わったタイミングでprint()による改行が行われます。

これにより、リストが表のような形で出力される仕組みになっています。

サンプルコード2: 数字の組み合わせを生成

次の例では、1から3までの数字の組み合わせを生成します。

# 数字の組み合わせを生成
for i in range(1, 4):  # 外側のループ
    for j in range(1, 4):  # 内側のループ
        print(f'({i}, {j})', end=' ')
    print()  # 行ごとに改行

ここではrange(1, 4)を使って、1から3までの数字を順番に取り出しています。

外側のループで変数 i が1から3まで変化し、そのたびに内側のループが動き出します。 内側のループでは変数 j が1から3まで変化し、現在の i と組み合わせた (i, j) というペアを表示します。

つまり、外側のループが一度進むたびに、内側のループがすべて実行されることで、すべての組み合わせが表示されるわけです。 出力は (1, 1) から始まり (3, 3) まで続きます。

サンプルコード3: 行列の加算

# 2つの行列を加算する
matrix_a = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

matrix_b = [
    [9, 8, 7],
    [6, 5, 4],
    [3, 2, 1]
]

result_matrix = []

for i in range(len(matrix_a)):  # 行数分ループ
    result_row = []
    for j in range(len(matrix_a[i])):  # 列数分ループ
        result_row.append(matrix_a[i][j] + matrix_b[i][j])  # 要素の加算
    result_matrix.append(result_row)

# 結果の表示
for row in result_matrix:
    print(row)

このプログラムでは、まず matrix_a と matrix_b という二つの行列を用意しています。それぞれ3行3列のリストです。 次に空のリスト result_matrix を作り、ここに計算結果を入れていきます。

外側のループでは i を使って行番号を指定し、各行を順番に処理します。 その中で、内側のループが j を使って列番号を指定し、対応する位置の要素同士を取り出して加算します。

その計算結果を result_row に追加し、行ごとの処理が終わったらresult_matrixに格納します。 最終的にすべての行が処理されると、新しく作成された加算後の行列がresult_matrixとして完成し、それを行ごとに表示しています。

このように、ネストしたループを使うことで、複雑なデータ構造を簡単に扱うことができます。次回は、繰り返しの中断やスキップについて学んでいきましょう。

出力結果: