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}



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


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






connaiconnai

辞書をキーで降順ソート

前述のように、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 = sorted(fruits.items(),key=lambda x:x[1],reverse=True)    #変更
fruits = dict((x, y) for x, y in fruits)
print(fruits)

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






Pythonのソートを関数にまとめる

Pythonの辞書を辞書のままソートしようとすると、lambdaやfor文が出てきてややこしいので、下記のような形で関数にまとめてしまうと使いやすいと思います。

#辞書をキーでソートする関数
def keySort(dicts, reverse=False):
    dicts = sorted(dicts.items(), reverse=reverse)
    dicts = fruits = dict((x, y) for x, y in dicts)
    return dicts


#辞書を値でソートする関数
def valSort(dicts, reverse=False):
    dicts = sorted(dicts.items(),key=lambda x:x[1], reverse=reverse)
    dicts = dict((x, y) for x, y in dicts)
    return dicts


下記のように使います。

fruits = {'Orrange':150, 'Apple':100, 'Grape':400, 'Banana':80}
fruits = keySort(fruits)                #キーで昇順ソート
fruits = keySort(fruits, reverse=True)  #キーで降順ソート
fruits = valSort(fruits)                #値で昇順ソート
fruits = valSort(fruits, reverse=True)  #値で降順ソート





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

参考になれば幸いです!

コメント

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