Python学習において、ループ処理は欠かせない基本構文です。
その中でもネストしたループ(入れ子構造のループ)は、より複雑な繰り返し処理を行うために非常に重要な考え方です。 ネストとは「入れ子」という意味で、ループの中にさらに別のループを入れることを指します。
ネストしたループの基本的な動作はとてもシンプルです。 外側のループが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()による改行が行われます。
これにより、リストが表のような形で出力される仕組みになっています。
次の例では、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) まで続きます。
# 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
として完成し、それを行ごとに表示しています。
このように、ネストしたループを使うことで、複雑なデータ構造を簡単に扱うことができます。次回は、繰り返しの中断やスキップについて学んでいきましょう。