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() でソートを行うと型が変わるので、辞書に戻してやりましょう。
下記のように記述します。
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 = 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)をソートする方法と注意点でした。
参考になれば幸いです!
コメント