Pythonで辞書(dict)をソートする方法と注意点


Pythonで初めて辞書をソートする時に、ソートの過程に思わぬ挙動があり少しハマってしまいました。

Pythonで辞書(dict)をソートする方法と注意点について記します。
最後に キー・値ソート、昇順・降順ソートのサンプルを載せておきます。




Pythonの辞書をキーで昇順ソート

ではまず一番シンプルなキーの昇順ソートを行ってみます。
Pythonで辞書をキーで昇順ソートするには sorted() を用いて下記のように記述します。

出力結果を見るとキーがアルファベット昇順にソートされていることがわかります。しかし何か違和感が。。

fruits = {'Orrange':150,'Apple':100,'Grape':400,'Banana':80}
fruits = sorted(fruits.items())
print(fruits)

#出力:[('Apple', 100), ('Banana', 80), ('Grape', 400), ('Orrange', 150)]






Pythonで辞書をソートする際の注意点

上記の出力結果はソート前の dictとは何か形式が違うように見えます。
気になるので出力してみます。
list の中に tupleが入る形になっています。

辞書を sorted() で並び替えると型が変わるため、そのまま辞書として扱おうとするとエラーが発生する場合があるので注意が必要です。

fruits = {'Orrange':150,'Apple':100,'Grape':400,'Banana':80}
fruits = sorted(fruits.items())
print(type(fruits))
print(type(fruits[0]))

#出力:<class 'list'>
#出力:<class 'tuple'>





sortした後に辞書に戻す(辞書をキーで昇順ソート)

上述の通りsorted() でソートを行うと型が変わるので、辞書に戻してやりましょう。
下記のように記述します。

参考:Pythonタプルを辞書に変換する方法

fruits = {'Orrange':150,'Apple':100,'Grape':400,'Banana':80}
fruits = sorted(fruits.items())
fruits = dict((x, y) for x, y in fruits)
print(fruits)

#出力:{'Apple': 100, 'Banana': 80, 'Grape': 400, 'Orrange': 150}



きちんとキーで昇順ソートされていて、型も辞書になっていますね。


では、以上の注意点を踏まえたら、値ソート、降順ソートについても見ていきましょう。






辞書をキーで降順ソート

前述のように、soreted() のデフォルトは昇順ソートとなっています。
降順ソートを行う場合は sorted() の引数に reverse=True を追加します。

fruits = {'Orrange':150,'Apple':100,'Grape':400,'Banana':80}
fruits = sorted(fruits.items(),reverse=True)
fruits = dict((x, y) for x, y in fruits)
print(fruits)

#出力:{'Orrange': 150, 'Grape': 400, 'Banana': 80, 'Apple': 100}






辞書を値で昇順ソート

辞書を値でソートするには、sorted() の引数に key=lambda x:x[1] を追加します。
前出の reverse=True は含めてないので、値の昇順そーとになります。

fruits = {'Orrange':150,'Apple':100,'Grape':400,'Banana':80}
fruits = sorted(fruits.items(),key=lambda x:x[1])
fruits = dict((x, y) for x, y in fruits)
print(fruits)

#出力:{'Banana': 80, 'Apple': 100, 'Orrange': 150, 'Grape': 400}





辞書を値で降順ソート

sorted() の引数に key=lambda x:x[1]reverse=True 両方含めると値の降順ソートになります。

fruits = {'Orrange':150,'Apple':100,'Grape':400,'Banana':80}
fruits = orted(fruits.items(),key=lambda x:x[1],reverse=True)
fruits = dict((x, y) for x, y in fruits)
print(fruits)






以上、Pythonで辞書(dict)をソートする方法と注意点でした。

参考になれば幸いです!

コメント

タイトルとURLをコピーしました