午後から→オーバークロック

駆け出しハッカー()によるプログラミング・サービス開発備忘録。

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})]

とすると整列できる。