福岡県だけどPythonを勉強する!

他言語を積極的に推奨する福岡県でPythonを勉強していく記録。

制御構文 - リスト内包表記

■■リスト内包表記

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 (PERFECT SERIES 5)