2012年11月29日木曜日

複数リストの各要素の平均値

複数リストの対応する要素同士に対していっぺんに処理をしたい。
リストの内包表記を使ってみた。

listA = [1.0, 2.0, 3.0]
listB = [4.0, 5.0, 6.0]
# 各要素の平均を取る。
M = [(x+y)/2 for count_x,x in enumerate(listA) for count_y,y in enumerate(listB) if count_x==count_y]
# 各要素を掛け合わせた値
N = [x*y for count_x,x in enumerate(listA) for count_y,y in enumerate(listB) if count_x==count_y]

結果:
M = [2.5, 3.5, 4.5]
N = [4.0, 10.0, 18.0]
特に後者は、ベクトルの内積を取るような時に使えるのかな、と思ったり。

Pythonのソート


Pythonでdict型のデータを作った時、キーではなく値でソートしたかった時に調べたメモ。

list.sort()とsorted()

x = [1,9,2,0,7]
y = [1,9,2,0,7]
x.sort()
x
sorted(y)
結果:sort()関数ではリスト自体が変更される。
x = [0,1,2,7,9]
y = [1,9,2,0,7]

というわけで、今回はsorted()を使ってリスト自体は変更しなかった。

dic = {"Yamada":"10", "Takeda":"50", "Itoh": "30", "Kinoshita": "20"}

結果:
dic = {'Kinoshita': '20', 'Takeda': '50', 'Yamada': '10', 'Itoh': '30'}
sorted(dic.items(), cmp=lambda x, y:cmp(int(x), int(y)), key=lambda x:x[1], reverse=True)
= [('Takeda', '50'), ('Itoh', '30'), ('Kinoshita', '20'), ('Yamada', '10')]

key=lambda x:x[1]のところで、どのオブジェクトで比較するのか指定できる。今回はx[1]と指定して、値で比較できる様になった。
cmp引数についても、比較するための関数を定義することで、文字列として与えられた数値をintに変換して比較できている。

参考URL: http://mglab.blogspot.jp/2008/06/python-sortsorted_3738.html