Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
34
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

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

この記事は 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
... ]

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
34
Help us understand the problem. What are the problem?