このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。
【Python入門】内包表記で多重ループさせる

内包表記で多重ループさせる
内包表記は、従来のforループとappendメソッドを使ったリスト生成を、シンプルで直感的な1行のコードで記述できる便利な構文です。特に、複数のループ(多重ループ)を使う場合、内包表記を用いるとネストしたループの構造をコンパクトに表現でき、コードの見通しが良くなります。ここでは、内包表記で多重ループを実現する方法について、具体的な例(ここでは「加算テーブル」を例に)と表を交えて解説します。

プログラムのダウンロード
「ダウンロード」から、JupyterLab で実行できるサンプルプログラムがダウンロードできます。ファイルは、ESET Endpoint Securityでウイルスチェックをしておりますが、ダウンロードとプログラムの実行は自己責任でお願いいたします。
1.内包表記と多重ループの基本
1.1. 内包表記の基本構文
内包表記では、以下の基本構文を用いてリストを生成します。
[式 for 変数 in イテラブル]
この構文は、イテラブル(例えばrange関数など)から要素を1個ずつ取り出し、指定した式を評価した結果をリストに追加します。
1.2. 多重ループを内包表記で表現する
多重ループ(ネストしたループ)は、内包表記ではfor節を連続して記述することで表現できます。以下の表は、通常のfor文と内包表記での多重ループの対応関係を示しています。
通常のfor文構造 | 内包表記での記述 |
---|---|
for x in イテラブルA: | [ 式 for x in イテラブルA |
for y in イテラブルB: | for y in イテラブルB ] |
文... |
たとえば、二重ループで全ての組み合わせに対して計算を行う場合、外側のループが先に記述され、内側のループが後に続きます。
2.内包表記で多重ループを用いた実践例
2.1. フラットなリストの作成例(加算テーブル)
以下の例では、1から5までの整数について、各ペアの和を計算し、その結果をフラットなリストに格納します。
# 1から5までの整数の各組み合わせの和をフラットなリストに格納
flat_sum_list = [x + y for x in range(1, 6) for y in range(1, 6)]
print(flat_sum_list)
実行結果
[2, 3, 4, 5, 6, 3, 4, 5, 6, 7, 4, 5, 6, 7, 8, 5, 6, 7, 8, 9, 6, 7, 8, 9, 10]
解説
- 外側のfor節
for x in range(1, 6)
により、xは1から5まで変化します。 - 内側のfor節
for y in range(1, 6)
で、各xに対してyも1から5まで変化し、xとyの和が計算されます。 - 計算結果はフラットなリストとして生成され、例えば出力は
[2, 3, 4, 5, 6, 3, 4, 5, 6, 7, 4, 5, 6, 7, 8, 5, 6, 7, 8, 9, 6, 7, 8, 9, 10]
となります。
2.2. ネストした内包表記による階層リストの作成例
次に、各外側のループごとに内側のリストを作成し、それらを外側のリストにまとめる方法を示します。これは、例えば加算テーブルを行ごとにリスト化する場合に有用です。
# 1から5までの各xに対して、1から5までのyとの和のリストを生成し、外側のリストにまとめる
nested_sum_list = [[x + y for y in range(1, 6)] for x in range(1, 6)]
print(nested_sum_list)
実行結果
[[2, 3, 4, 5, 6], [3, 4, 5, 6, 7], [4, 5, 6, 7, 8], [5, 6, 7, 8, 9], [6, 7, 8, 9, 10]]
解説
- 外側の内包表記
for x in range(1, 6)
により、各行に対応するxの値が決まります。 - 内側の内包表記
[x + y for y in range(1, 6)]
により、各xに対して1から5までのyとの和が計算され、リストとして生成されます。 - 結果として、ネストされたリストが生成され、出力例は
[[2, 3, 4, 5, 6], [3, 4, 5, 6, 7], [4, 5, 6, 7, 8], [5, 6, 7, 8, 9], [6, 7, 8, 9, 10]]
となります。各内側のリストは、ある固定のxに対する全てのyの和を示しています。
まとめ
内包表記を使った多重ループは、従来のネストしたfor文よりも短く、読みやすいコードでリストなどのデータ構造を生成する方法です。
- 基本構文は
[式 for 変数 in イテラブル]
で、複数のfor節を連続して書くことで多重ループを表現します。 - フラットなリストを生成する場合は、単一の内包表記で全ての要素を1つのリストに格納できます。
- ネストした内包表記を使うと、内側のリストを生成し、それを外側のリストにまとめることで、階層的なデータ構造を簡潔に作成できます。
これらのテクニックを活用することで、より効率的で見通しの良いPythonコードを書くことが可能となります。