LoginSignup
28
37

More than 5 years have passed since last update.

内包表記を使ってリストの作成を簡潔に書く

Last updated at Posted at 2017-12-02

この記事は 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文だと

  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
... ]

参考

28
37
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
37