Pythonで少し複雑な辞書オブジェクトをsortする
自然言語処理とかやってるプログラムでsortをよく使うのに、その割に毎回忘れるのでメモ
基本
>>>terms = {'hoge':1, 'fuga':3, 'null':2} >>>sorted(terms.items(),key=lambda x:x[1],reverse=True) [('fuga', 3), ('null', 2), ('hoge', 1)]
.items()
は辞書に対して(key, value)
タプルを要素としたリストを返すので、
本来引数にリストしか取らないsorted()
でも整列できるという仕組み。
key引数には関数オブジェクトを渡している。
lambda x:x[1]
とは
def tmp(x): return x[1]
と同じ意味。
つまり、リストの各要素((key, value)
タプル)を引数xに渡し、
その返り値x[1](value)で整列しろ、と命令している。
reverse=True
は降順で整列させる。
応用
次のように少し多次元的になっている辞書を、指定の要素scoreの順に整列してみる。
>>>terms = {'hoge':{'score':3}, 'fuga':{'score':1}, 'null':{'score':2}}
結局lambdaの返り値の部分をいじれば良いだけ。
xには('hoge', {'score':3})
とかが渡されてることに気をつける。
>>> sorted(terms.items(),key=lambda x:x[1]['score'],reverse=True) [('hoge', {'score': 3}), ('null', {'score': 2}), ('fuga', {'score': 1})]
とすると整列できる。