この記事は Pythonのコードを短く簡潔に書くテクニック Advent Calendar 2017 の1日目です。
内包表記とは
内包表記は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文だと
- 空のリストを生成する
- for文
- リストに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
... ]
参考
- Python3 チュートリアル