読者です 読者をやめる 読者になる 読者になる

Bag of ML Words

ML = Machine Learning, Music Love, and Miscellaneous things in daily Livings

Python: リスト内包表記(List Comprehensions)

えー、気づけばずいぶん書いていませんね・・・。

書きたいことのストックはあって

  • NIPS13のRapid distance-based outlier detectionの解説
  • Bayesian for Hackersの続き

ぐらいは書く時間さえ取れればかけるんですけど・・・*1

 

でも久々に書きます。

Python全然慣れない私にとって良い福音となりそうな話があったので。

 

まずは、どうも慣れないリスト内包表記(List Comprehensions *2 )について。

元々の説明は

5. Data Structures — Python v2.7.8 documentation

にありますね。ここ、filterとかlambdaとかもあって大事かもしれません。

 

とにかく、リスト内包表記ってこういうやつですね。

 

>>> import numpy as np
# for文

>>> squares = np.zeros(10)
>>> for d in xrange(10):
... squares[d] = d**2
...
>>> squares
array([ 0., 1., 4., 9., 16., 25., 36., 49., 64., 81.])

# list内包表記

>>> squares2 = [x**2 for x in xrange(10)]
>>> squares2
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

for文で書きたくなっちゃうよ

やっぱりリストを扱うときはどんどんfor文で書きたくなるのですが、

蛇使いとしては下策らしいですね・・・。

Pythonを高速化するCythonを使ってみた - Kesin's diary

この記事はCythonの喜びを語っていらっしゃいますが、リストをfor文appendで増やすよりは内包表記で書いた方が早いよとも書いてありました。

でも、ちょっと難しいのです・・・まず読めない。

 

良い読み方

で、何かいい読み方の説明がないかなぁと思って調べたら

半蔵門の社窓から: Pythonを使ってみよう

こちらの記事で、「数学の集合表記そのものだよ!」という良いお言葉が。

では

5. Data Structures — Python v2.7.8 documentation

の例をそうやって解読してみましょうか・・・。

 >>> D = [-4, -2, 0, 2, 4]
>>> S1 = [x*2 for x in D]
>>> S1
[-8, -4, 0, 4, 8]
>>> S2 = [x for x in D if x >= 0]
>>> S2
[0, 2, 4]

ここで、Dは全要素(元)の集合で、S1, S2はそれを元にして生成した集合ですね。

数式で書くと、

 

f:id:Dr_KayAi:20140723160434p:plain

f:id:Dr_KayAi:20140723160721p:plain

f:id:Dr_KayAi:20140723160731p:plain

 

ややっ、これはわかりやすいかもですね!

*1:キーボード買えなくなったとの同じprivateな理由でゴニョゴニョ

*2:comprehensionって「理解」と思っていましたが、むしろ包括、包含、総括てきな感じなんですね。すべてを含んで把握する的な意味でしょうか