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

技術メモ

役に立てる技術的な何か、時々自分用の覚書。統計学、機械学習、神経科学、暗号理論...と幅広く興味があります。

pythonでたまに使う用法(リスト・内包表記・三項演算子・lambda…)

pythonのちょっと特殊だけどたまに使う記法について備忘録。
※2.7系で動かしているので3系では動かないかもしれない。要調査。

リスト操作

リストの重複削除
a = [1,1,4,4,3,3,2,2,5,5]
list(set(a))
# >>[1,2,3,4,5]

※この書き方だと順序は保持されない

順序を保持するリストの重複削除はこうする

sorted(set(a), key=a.index)
# >>[1,4,3,2,5]
リストの結合
a = [1,2,3]
b = [4,5,6]
c = a + b
# >>[1,2,3,4,5,6]
リストのソート
sorted(a) # 1
a.sort()   # 2

1の場合はソートされたリストが返されるが、引数のリストは元の状態を保持。
2の場合は値が返ってこないが、ソートされた状態になるので注意が必要。
いわば2は a = sorted(a) と同じ

リスト内包表記

基本
[i*i for i in range(10)]
# >>[0,1,4,9,16,25,36,49,64,81,100]
応用

ユークリッド距離を求めるのに使ったり

import numpy as np
c1 = [1, 2, 3]
c2 = [0, 0, 0]
distance = np.sqrt(sum([(a - b)**2 for a, b in zip(c1, c2)]))

三項演算子

x = "Fizz" if True else "Buzz"

実は結構新しくて、2.5以降からできたらしい。
それ以前はめっちゃ不便だっただろうな…

リスト内包表記との合わせ技
[0 if i%3==0 else i for i in range(10)]
# >>[0, 1, 2, 0, 4, 5, 0, 7, 8, 0]

lambda式

map, filterとの組み合わせ
map(lambda x:x*x ,range(10))
# >>[0,1,4,9,16,25,36,49,64,81,100]

※リスト内包表記の上の例と同じ。

filterを使ってある文字列を含む要素を取り出すことができる

keyword = ["windows","linux","mac","android"]
filter(lambda x:"win" in x, keyword)
# >>['windows']
sortedやmaxなどとの組み合わせ

要素に注目してソートしたり、距離の最大値を求めたりできる。

import random
a = [[random.random() for i in range(2)] for j in range(20)]
sorted(a, key=lambda x:x[0])
max(a, key=lambda x:x[0]**2+x[1]**2)

可読性が悪いのであまりに複雑な処理なら関数にした方がいいかもしれない


参考サイト:
Pythonで配列内の重複する値を抽出する方法 - Pashango’s Blog
[Pythonの無名関数(lambda)の使い方 - Life with Python