Pythonで「二重ループ(ネストされたfor文)」を書くことは、競技プログラミングやデータ処理において日常茶飯事です。
しかし、三重ループや四重ループになると、計算量の影響や可読性の低下に注意が必要です。
この記事では、Pythonでの2重ループ、3重ループ、4重ループの書き方を実例付きで解説し、計算量の重要性や実戦での使い分けの注意点についても触れます。
✅ Pythonの二重ループの書き方(2重for文)
2重ループは、2次元配列の処理やすべてのペアの比較などで頻出です。
# 3x3 の表を出力
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
...
✅ Pythonの三重ループの書き方(3重for文)
3重ループは、3次元データの処理や3つの要素の組み合わせ探索などに使われます。
# 3×3×3 の空間を探索
for i in range(3):
for j in range(3):
for k in range(3):
print(f"i={i}, j={j}, k={k}")
計算量:O(N^3)
となるため、N
が大きくなると極端に遅くなります(例えば N=100
なら 1,000,000 回ループ)。
✅ Pythonの四重ループの書き方(4重for文)
4重ループは、非常に重い処理になるため、競技プログラミングでは よほどの理由がない限り避けられます。
# 2×2×2×2 の空間
for i in range(2):
for j in range(2):
for k in range(2):
for l in range(2):
print(f"i={i}, j={j}, k={k}, l={l}")
✅ 出力回数:16回(2×2×2×2)
⚠ 実戦では:
O(N^4)
になるため、N=50
で 625万回のループになります。- TLE(時間切れ) になる可能性が高いため、別の方法(DP、累積和、メモ化)を考えるのが基本です。
🧠 実戦では「計算量」の見積もりが重要!
多重ループを書く際には、計算量を意識するクセをつけましょう。
重さ | 計算量 | 適切な N の目安(1秒以内) |
---|---|---|
2重ループ | O(N^2) | N ≦ 1000〜2000 |
3重ループ | O(N^3) | N ≦ 200〜300 |
4重ループ | O(N^4) | N ≦ 50 以下推奨(場合により不可) |
❗ 4次元配列を使う機会はほとんどない?
実務や競プロでは、4次元配列をそのまま扱うケースはかなり稀です。
- 実用的には3次元までで十分なケースがほとんど
- 多次元配列はメモリ使用量や可読性の問題が大きく、代替手段があるならそちらを優先すべき
例:不要な次元をflattenして1〜2次元に圧縮することが多い
📌 リスト内包表記で2重配列を初期化する例
H, W = 3, 4
grid = [[0]*W for _ in range(H)]
この形式なら、2重ループでアクセスできます:
for i in range(H):
for j in range(W):
grid[i][j] = i + j
🔍 まとめ:多重ループは書けるが、使いすぎ注意!
ループの深さ | 用途例 | 注意点 |
---|---|---|
2重ループ | 二次元配列、全ペア探索 | 通常使用可 |
3重ループ | 組み合わせ、3次元空間 | Nに注意 |
4重ループ | レア。DPなど一部例外 | 原則避ける。要最適化 |
4次元配列 | ほぼ使わない | メモリ・設計的に非推奨 |
🔎 関連キーワード
- Python 二重ループ 書き方
- Python 3重ループ for文
- Python 4重ループ 実行速度
- Python 多重ループ 計算量
- Python 多次元配列 初期化
💬 最後に
Pythonに限った話ではりませんが多重ループは強力な武器ともなる手法ではありますが、ループが深くなるほど計算量が爆発的に増加します。
アルゴリズムの工夫や、別のデータ構造(set, dict, DPなど)を活用することで、より効率的な解法を目指すべきだと個人的には考えております。