【Python】第2章第7回:ネストされたループの記述方法
Pythonでは、ループをネストする(入れ子にする)ことで、より複雑な処理を記述できます。本記事では、ネストされたループの基本構造から応用例までを解説します。
0. 記事の概要
この記事を読むメリット
- ネストされたループの理解:二次元配列や表形式データの操作方法が学べます。
- 複雑な処理の構築:ループ内でさらにループを用いることで高度な処理が可能になります。
- エラーを回避:よくあるミスや注意点を把握できます。
この記事で学べること
- ネストされたループの基本構造
- 二次元配列やリストの操作方法
- ネストされたループを用いた実践的なプログラム
1. ネストされたループの基本構造
1.1 基本的な記述方法
ネストされたループは、外側のループが1周するごとに内側のループが完全に実行されます。
# ネストされたループの基本例
for i in range(3):
for j in range(2):
print(f"i: {i}, j: {j}")
動作解説
- 外側のループ(
for i in range(3)
)が3回繰り返されます。 - 内側のループ(
for j in range(2)
)は、外側のループが1回繰り返されるごとに2回実行されます。 - 結果として、全体で6回の出力が行われます。
1.2 注意点
ネストされたループでは、内側のループが繰り返される回数が増えるため、処理が複雑になる場合があります。
- 処理の効率に注意が必要です。
- 必要以上に深いネストは避けましょう(2~3段階が一般的)。
2. ネストされたループの応用例
2.1 二次元リストの操作
ネストされたループは、二次元リスト(リストの中にリストがある構造)を操作する際によく使われます。
# 二次元リストの操作
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
for row in matrix:
for value in row:
print(value, end=" ")
print() # 改行
動作解説
- 外側のループ(
for row in matrix
)で各行(リスト)が順に取り出されます。 - 内側のループ(
for value in row
)で各要素が出力されます。 end=" "
を指定して、改行を防ぎ、print()
で行ごとに改行を挿入します。
2.2 条件を伴うネストされたループ
条件式を組み合わせることで、特定の条件に基づいた処理を行えます。
# 条件付きのネストされたループ
for i in range(3):
for j in range(3):
if i == j:
print(f"一致: i = {i}, j = {j}")
動作解説
- 内側のループで、外側のループの変数と一致する条件(
i == j
)を評価します。 - 条件が
True
の場合のみ出力が行われます。
3. 実践例:ネストされたループを活用したプログラム
九九表を表示するプログラムを作成します。
# 九九表の表示
for i in range(1, 10):
for j in range(1, 10):
print(f"{i} x {j} = {i * j}", end="\t")
print()
動作解説
- 外側のループ(
for i in range(1, 10)
)が1から9までの数値を処理します。 - 内側のループ(
for j in range(1, 10)
)も同様に1から9までの数値を処理します。 - 掛け算の結果を
i * j
で計算し、九九表形式で出力します。
4. 練習問題
以下の課題に挑戦してみましょう。
- 二次元リストを操作し、各要素を2倍にして新しい二次元リストを作成してください。
- 星印(
*
)を使って以下のような三角形を描画するプログラムを作成してください。 * ** *** **** *****
5. 練習問題の解答と解説
問1の解答例
# 二次元リストの要素を2倍
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
new_matrix = []
for row in matrix:
new_row = [value * 2 for value in row]
new_matrix.append(new_row)
print(new_matrix)
問2の解答例
# 星印で三角形を描画
for i in range(1, 6):
print("*" * i)
6. まとめ
ネストされたループを使うことで、二次元配列や複雑な処理を効率的に記述できます。これを基に、さらに応用的なプログラムを作成してみてください。