このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

【Python入門】リストの内包表記

リストの内包表記

 リストの内包表記は、従来のforループやappendメソッドを使ったリスト生成を、非常にシンプルかつ直感的に記述できるPython独自の構文です。これにより、短く読みやすいコードでデータ構造を作成でき、処理の意図が明確になります。ここでは、リストの内包表記の基本構文から、条件付き内包表記、そして内包表記を応用した集合や辞書の作成方法まで、具体例と解説を交えて説明します。

プログラムのダウンロード

 「ダウンロード」から、JupyterLab で実行できるサンプルプログラムがダウンロードできます。ファイルは、ESET Endpoint Securityでウイルスチェックをしておりますが、ダウンロードとプログラムの実行は自己責任でお願いいたします。

1.リストの内包表記の基本

1.1. 内包表記の概要

 リストの内包表記(list comprehension)では、イテラブルなオブジェクトから要素を取り出し、指定した式を評価した結果を新しいリストとして生成します。従来のforループを用いたリスト生成に比べ、コードがコンパクトになり、処理の流れが一目で理解できるようになります。

1.2. 基本構文

リストの内包表記の基本構文は次の通りです。

[式 for 変数 in イテラブル]

たとえば、0から9までの整数の2乗を格納するリストは、次のように記述できます。

# 0から9までの整数の2乗を格納したリストを生成
squares = [x * x for x in range(10)]
print(squares)

実行結果

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

解説

  • range(10) により0から9までの整数が順に取り出され、変数 x に代入されます。
  • x * x という式が各 x に対して評価され、その結果が新しいリストに格納されます。
  • 結果として、[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] が出力されます。

1.3. 条件付き内包表記

 内包表記では、for節に加えてif節を用いることで、特定の条件を満たす要素のみをリストに含めることができます。例えば、1から20までの整数のうち、奇数の3乗だけを格納するリストは次のように作成できます。

# 1から20までの整数のうち、奇数のみの3乗を計算してリストに格納
odd_cubes = [x ** 3 for x in range(1, 21) if x % 2 == 1]
print(odd_cubes)

実行結果

[1, 27, 125, 343, 729, 1331, 2197, 3375, 4913, 6859]

解説

  • range(1, 21) で1から20までの整数が生成されます。
  • if x % 2 == 1 により、奇数のみが対象となります。
  • x ** 3 で奇数の3乗が計算され、リストに格納されます。

2.その他の内包表記の活用

2.1. 集合の内包表記

 リストの内包表記と同様の記法で、角括弧を波括弧に置き換えるだけで集合の内包表記を記述できます。たとえば、0から9までの整数の2乗を格納する集合は次のように書けます。

# 0から9までの整数の2乗を格納した集合を生成
squares_set = {x * x for x in range(10)}
print(squares_set)

実行結果

{0, 1, 64, 4, 36, 9, 16, 49, 81, 25}

解説

  • 集合は順序が保証されないため、出力される順序は毎回変わる可能性があります。
  • 同じ値が複数回生成されても、集合には一度だけ格納されます。

2.2. 辞書の内包表記

 辞書の内包表記では、キーと値を生成する2つの式をコロン(:)で区切って記述します。例えば、0から9までの整数について、2乗をキー、元の整数を値とする辞書は次のように作成できます。

# 0から9までの整数について、2乗をキー、元の整数を値として格納する辞書を生成
squares_dict = {x * x: x for x in range(10)}
print(squares_dict)

実行結果

{0: 0, 1: 1, 4: 2, 9: 3, 16: 4, 25: 5, 36: 6, 49: 7, 64: 8, 81: 9}

解説

  • キーの部分には x * x の結果、値の部分には元の x が対応付けられます。
  • 結果として、例えば {0: 0, 1: 1, 4: 2, 9: 3, 16: 4, 25: 5, 36: 6, 49: 7, 64: 8, 81: 9} のような辞書が生成されます。

まとめ

リストの内包表記は、forループや条件分岐を簡潔に表現できる強力な構文です。

  • 基本的な構文は [式 for 変数 in イテラブル] であり、これを使ってリストの各要素を一行で生成できます。
  • if節を追加することで、条件付きの内包表記も記述でき、不要な要素を除外することが可能です。
  • また、内包表記の応用として、集合や辞書の生成にも同様の記法を用いることができ、プログラム全体の記述を簡潔にまとめることができます。

 これらのテクニックを習得することで、より読みやすく効率的なPythonコードを書くことが可能となります。