
目標
(pythonの)「内包表記」について、概要を理解して利用できる。
内包表記
内包表記の概要
内包表記は、Pythonでリストや辞書、集合などのミュータブルなイテラブルオブジェクトをシンプルかつ高速に生成する仕組みです。内包表記では、if文や二重for文を扱って特定の条件に当てはまる要素のみを持たせたり、二重リストを生成することも可能です。
「外延的記述」と「内延的記述」
「外延的記述」と「内延的記述」という言葉は、数学の集合を表すときや、論理学や哲学、言語学などの分野で使われる用語ですが、Pythonやプログラミングにおいても異なる方法でデータを定義(表現)する際に使われます。
外延的記述(Extensionally Defined)
外延的記述とは、ある概念や集合を、その中に含まれる要素(実体)を全て列挙することで定義する方法です。
例:自然数の集合を外延的に定義するとき、「x = { 0, 1, 2, 3, 4, 5,…}」と、その要素をすべて挙げる形になります。
Pythonでの外延的記述の例
# 数字1から5までを外延的に定義したリスト
numbers = [1, 2, 3, 4, 5]
内延的記述(Intensionally Defined)
内延的記述は、ある概念や集合を、その集合に共通する性質や特徴を使って定義する方法です。
例:自然数の集合を内延的に定義するとき、「{ x | x は0以上の整数}」や「{{ x | x は自然数の集合}」といった形で、条件を挙げてその集合を定義します。
Pythonでの内延的記述の例
# 1から5までの数字を内延的に定義する
numbers = [x for x in range(1, 6) ]
- 外延的記述: 集合の具体的な要素を全て列挙して定義する方法。
例: [1, 2, 3]、{‘apple’, ‘banana’, ‘cherry’} - 内延的記述: 集合の共通の性質や条件を使って定義する方法。
例1: [x for x in range(10) if x % 2 == 0]
例2:{x for x in range(10) if x > 5}

1.基本的な内包表記
基本的な内包表記は次のように記述します。
# 1から5までの数字を内延的に定義する
numbers = [x for x in range(1, 6)]

次のように「条件から生成した要素」を左の変数部分で演算にかけることもできます。
# 1から5までの平方をリストにする
squares = [x**2 for x in range(1, 6)]
print(squares) # 出力: [1, 4, 9, 16, 25]

2.条件付き内包表記
内包表記には条件を加えることもできます。例えば、偶数だけを取り出したい場合は次のように書きます。
# 1から10までの偶数の平方をリストにする
even_squares = [x**2 for x in range(1, 11) if x % 2 == 0]
print(even_squares) # 出力: [4, 16, 36, 64, 100]

3.ふたつの繰り返し文を利用する(パターン1)
内包表記でふたつの「for文」を利用すると最初のfor文を1Stepするごとに、次のfor文の繰り返しを全て行うといった動きをします。
# 1から3までの数をそれぞれ3度ずつ繰り返して生成する。
simple_list = [x for x in range(1, 4) for y in range(1, 5)]
print(simple_list)
# 出力: [1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3]
# 1から3までの数を3度繰り返して生成する。
simple_list = [y for x in range(1, 4) for y in range(1, 5)]
print(simple_list)
# 出力: [1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4]
4.ふたつの繰り返し文を利用する(パターン2)
内包表記も二重にすると二重リスト(リストの中にリストがある)を生成する事ができます。
# 1から3までのリストを要素とする、みっつのリストを作成する
matrix = [[x for x in range(1, 4)] for y in range(1, 4)]
print(matrix)
# 出力: [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
# 外側のfor文の1Stepごとを要素とする、みっつのリストを作成する
matrix = [[y for x in range(1, 4)] for y in range(1, 4)]
print(matrix)
# 出力: [[1, 1, 1], [2, 2, 2], [3, 3, 3]]
内包表記を公式のように表現すると次の通りです。

実行の流れ
- 外側のループ (for y in range(1, 4)) が始まり、yが1から3まで繰り返されます。
- 各yに対して、内側のfor x in range(1, 4)が実行され、xが1から3まで繰り返されます。
具体的には、最初にy=1となり、内側のループが実行されて、xが1から3まで繰り返されます。次に、y=2のときに内側のループが再び実行され、同様にx=1からx=3まで繰り返されます。最後に、y=3で同様の処理が行われます。
4.条件付きの二重リスト
二重リストに条件を追加することもできます。例えば、内側のリストで条件を追加したい場合、次のように書けます。
# 1から3までの整数を使って、条件付きで内側のリストを作成
matrix_filtered = [[x * y for x in range(1, 5) if x % 2 == 0] for y in range(1, 4)]
print(matrix_filtered)
# 出力: [[2, 4], [4, 8], [6, 12]]
この例では、内側のリストでx % 2 == 0という条件を使って偶数のみにしています。
今回は以上になります。

ブックマークのすすめ
「ほわほわぶろぐ」を常に検索するのが面倒だという方はブックマークをお勧めします。ブックマークの設定は別記事にて掲載しています。

