内包表記とは

内包表記はPythonの特徴的な文法で、リストや辞書などの生成が1行で簡潔に書ける便利な文法です。

内包表記にはいくつか種類があります。

リストを生成する「リスト内包表記」
>>> [i for i in range(5)]
[0, 1, 2, 3, 4]
辞書を生成する「辞書内包表記」
>>> {c: c.upper() for c in 'abcde'}
{'a': 'A', 'c': 'C', 'b': 'B', 'e': 'E', 'd': 'D'}
セットを生成する「セット内包表記」
>>> {c for c in 'abcdcdcd'}
{'b', 'd', 'a', 'c'}
ジェネレータを生成する「ジェネレータ式」
>>> (c.upper() for c in 'abcde')
<generator object <genexpr> at 0x10a5db308>

ここではリスト内包表記に絞って説明します。

リストの生成をfor文と比較

for文でリストを作成
>>> values = []
>>> for i in range(5):
...     values.append(i)
...
>>> values
[0, 1, 2, 3, 4]
内包表記でリストを作成
>>> values = [i for i in range(5)]
>>> values
[0, 1, 2, 3, 4]

for文だと

  1. 空のリストを生成する
  2. for文
  3. リストにappendする

の3行が必要ですが、内包表記だと1行で簡潔に書くことができます。

ifでフィルタリングする

ifを使ってリストの内容をフィルタリングできます。

for文でフィルタリング
>>> results = []
>>> for i in range(5):
...     if i % 2 == 0:
...         results.append(i)
...
>>> results
[0, 2, 4]
内包表記でifを使ってフィルタリング
>>> results = [i for i in range(5) if i % 2 == 0]
>>> results
[0, 2, 4]

複数のfor

内包表記内で複数のforを書くことで、for文をネストした時のような動作を書けます。

for文のネスト
>>> values = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> results = []
>>> for i in values:
...     for j in i:
...         if j % 2 == 0:
...             results.append(j)
...
>>> results
内包表記で複数のfor
>>> values = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> results = [j for i in values for j in i if j % 2 == 0]
>>> results
[2, 4, 6, 8]

改行して見やすくする

内包表記内の式が長い場合や複数のforを使う場合は、見やすくするために改行すると良いです。

>>> results = [
...     j
...     for i in values
...     for j in i
...     if j % 2 == 0
... ]

参考