lambdaって何回見ても「ランバダ」としか読めません。ポンダッドです。

少し前に、「辞書型(連想配列)」の値でソートするのに悩んだのですが、Pythonの場合「無名関数」と言うものを使うと簡単に出来る様です。試しにこんな風に書いて見ました。

1
2
3
4
5
6
7
8
import indicoio
indicoio.config.api_key = 'YOUR_API_KEY'
emotion = indicoio.fer("PATH_TO_YOUR_IMAGE")
max_emotion = []
for i, j in sorted(emotion.items(), key=lambda x:x[1],reverse=True):
result = "{0}は{1}です。".format(i, j)
max_emotion.append(result)
print(max_emotion[0])

機械学習サービス indico.io を利用して写真を読み取り、感情認識させます。

1
2
$ python3 work7.py
Happyは0.3192397194です。

一番数値の高い感情のキーと値を表示させて見ました。実際に返ってきたjsonはこの様なものです。

1
2
3
4
5
6
7
8
{
'Neutral': 0.1727633894,
'Surprise': 0.0222118284,
'Sad': 0.1466555529,
'Fear': 0.1679430911,
'Happy': 0.3192397194,
'Angry': 0.17118641880000002
}

無名関数「ラムダ(lambda)」

無名関数を使うことで「リスト(配列)」や「辞書型(連想配列)」の要素全てに処理を行うことが可能になります。

…と教科書には書いてありますが、一番用利用出来そうなのは「辞書型(連想配列)」の値でソートの様な気がしたのでそれしか試してません。

教科書のサンプルを元にこんなサンプルを書いてみます。

1
2
3
4
5
6
7
8
9
10
11
12
13
cinema_dict = {
"プロメテウス": 15,
"ミッション・トゥ・マーズ": 8,
"2001年宇宙の旅": 98,
"宇宙兄弟": 65
}
cinema_score = sorted(
cinema_dict.items(),
key=lambda x: x[1],
reverse=True)
for title,score in cinema_score:
print(title, score)

実行します。

1
2
3
4
5
$ python3 work8.py
2001年宇宙の旅 98
宇宙兄弟 68
プロメテウス 15
ミッション・トゥ・マーズ 8

前回試してみた様に、Pythonの「辞書型(連想配列)」は items() メソッドを利用することでキーと値をセットで取り出すことが出来ます。

これを利用して sorted() を使って値でソートすることが可能になります。

keyメソッドに無名関数(ランバダ lambda)を指定することで「辞書(連想配列)」要素のキー全てに適応出来る、と言う訳です。

まとめ

Pythonはまだ試したばかりで、相変わらず「カッコが少なくていいなあ」と言うつまらない感想しか持てませんが、少しづつ気になる処理を試してみようと思います。

参考書籍

実践力を身につける Pythonの教科書 - Amazon.co.jp