このページで解説している内容は、以下の 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コードを書くことが可能となります。