制御構文 - リスト内包表記
■■リスト内包表記
list Conprehension
既存のリストやジェネレータから新しいリストを作る。
>>> result = [x**2 for x in range(1,11)]
>>> print(result)
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
通常のforループの場合
>>> for x in range(1,11):
... result.append(x**2)
...
>>> print(result)
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
既存のリストから取り出した要素に対して処理だけでなく、
条件にマッチしたものだけを新しいリストに追加することも可能。
>>> result = [x**2 for x in range(1,11) if x%2 == 0]
>>> print(result)
[4, 16, 36, 64, 100]
forを続けて2重ループも可能。
>>> vec = [[1,2,3],[4,5,6],[7,8,9]]
>>> [num for elem in vec for num in elem]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
通常のforループの場合
>>> result =
>>> for elem in vec:
... for num in elem:
... result.append(num)
...
>>> print(result)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
内包表記のメリット
・処理を簡潔に書ける。
・追加メソッドの呼び出しコストを軽減。
・処理時間のコストを削減。
■■その他の内包表記
セット内包表記
リストのの代わりに{}を使う。
>>> {x**2 for x in range(1,11)}
{64, 1, 36, 100, 81, 9, 16, 49, 25, 4}
辞書内包表記
>>> {x**2:x**2 for x in range(1,11)}
{64: 64, 1: 1, 36: 36, 100: 100, 81: 81, 9: 9, 16: 16, 49: 49, 25: 25, 4: 4}
リスト内包表記をジェネレータとして処理を遅延する事も可能。
[]の代わりに()を使う。
>>> res = (x**2 for x in range(1,11))
>>> next(res)
1
>>> next(res)
4
>>> next(res)
9
※ジェネレータとは・・・発電機、発生器、生成元などの意味を持つ英単語。ITの分野では、決められた条件などに基づいてデータやプログラムコードを自動的に生成するプログラムなどのことを指す。
パーフェクトPython (PERFECT SERIES 5)
- 作者: Pythonサポーターズ
- 出版社/メーカー: 技術評論社
- 発売日: 2013/03/05
- メディア: 大型本
- 購入: 1人 クリック: 65回
- この商品を含むブログ (19件) を見る