note.nkmk.me

Pythonリスト内包表記の使い方

Date: 2017-02-02 / Modified: 2018-03-15 / tags: Python, リスト
このエントリーをはてなブックマークに追加

新しいリストを作るときに、リスト内包表記(List comprehension)を使うとシンプルに書けるが、取っ付きにくいので簡単にまとめておく。

公式ドキュメントは以下。

ここでは、

  • リスト内包表記の基本型
  • if文で条件分岐したリスト内包表記
  • ネストしたリスト内包表記

についてサンプルコードとともに説明する。

リスト内包表記を活用した具体例は以下の記事を参照。

リスト内包表記の基本型

リスト内包表記は以下のように書く。

[`式` for `任意の変数名` in `イテラブルオブジェクト`]

リストやタプルなどのイテラブルオブジェクトの各要素に対してが評価され、その結果が要素となる新たなリストが返される。変数名は任意の名前を自分で決めてよい。

等価なfor文とともに例を示す。

squares = [i**2 for i in range(5)]
print(squares)
# [0, 1, 4, 9, 16]

squares = []
for i in range(5):
    squares.append(i**2)

print(squares)
# [0, 1, 4, 9, 16]

if文で条件分岐したリスト内包表記

if文で条件分岐することも可能。

[`式` for `任意の変数名` in `イテラブルオブジェクト` if `条件式`]

条件式Trueとなるイテラブルオブジェクトの要素のみで評価され、その結果が要素となる新たなリストが返される。

等価なfor文とともに例を示す。

odds = [i for i in range(10) if i % 2 == 1]
print(odds)
# [1, 3, 5, 7, 9]

odds = []
for i in range(10):
    if i % 2 == 1:
        odds.append(i)

print(odds)
# [1, 3, 5, 7, 9]

上の例では、条件を満たさない要素は新たなリストから除外される。

条件によって処理を切り替えたい(if elseのようなイメージ)を実現したい場合は三項演算子を使う。

Pythonでは三項演算子は以下のように書ける。

`真の値` if `条件式` else `偽の値`

これを以下のようにリスト内包表記のの部分に使う。

[`真の値` if `条件式` else `偽の値` for `任意の変数名` in `イテラブルオブジェクト`]

等価なfor文とともに例を示す。

odd_even = ['odd' if i % 2 == 1 else 'even' for i in range(10)]
print(odd_even)
# ['even', 'odd', 'even', 'odd', 'even', 'odd', 'even', 'odd', 'even', 'odd']

odd_even = []
for i in range(10):
    if i % 2 == 1:
        odd_even.append('odd')
    else:
        odd_even.append('even')

print(odd_even)
# ['even', 'odd', 'even', 'odd', 'even', 'odd', 'even', 'odd', 'even', 'odd']

真の値, 偽の値任意の変数名を使った式を記述することもできる。

条件を満たす場合は何らかの処理を行い、満たさない場合はイテラブルオブジェクトの値そのままというようなことが可能。

odd10 = [i * 10 if i % 2 == 1 else i for i in range(10)]
print(odd10)
# [0, 10, 2, 30, 4, 50, 6, 70, 8, 90]

ネストしたリスト内包表記

forループをネストするように、複数のイテラブルオブジェクトを組み合わせることもできる。

[`式` for `変数名1` in `イテラブルオブジェクト1`
    for `変数名2` in `イテラブルオブジェクト2`
        for `変数名3` in `イテラブルオブジェクト3`]

等価なfor文とともに例を示す。

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

flat = [x for row in matrix for x in row]
print(flat)
# [1, 2, 3, 4, 5, 6, 7, 8, 9]

flat = []
for row in matrix:
    for x in row:
        flat.append(x)

print(flat)
# [1, 2, 3, 4, 5, 6, 7, 8, 9]

複数の変数を使うことも可能。

cells = [(row, col) for row in range(0, 3) for col in range(0, 2)]
print(cells)
# [(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1)]

条件分岐もできる。

cells = [(row, col) for row in range(0, 3)
         for col in range(0, 2) if col == row]
print(cells)
# [(0, 0), (1, 1)]

それぞれのイテラブルオブジェクトに対して条件分岐することもできる。

cells = [(row, col) for row in range(0, 3) if row % 2 == 0
         for col in range(0, 2) if col % 2 == 0]
print(cells)
# [(0, 0), (2, 0)]
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事