Pythonで辞書を並べ替えたり逆順にしたい

Pythonで辞書を並べ替えたり逆順にしたい

辞書のソート

Python3.6からPEP 468により辞書には順番がつくようになりました。

当然、「それなら辞書もソートできるのでは?」となってあの頃は試していました。

d = {'a': 1, 'c': 3, 'b': -4}
sorted(d)
# ['a', 'b', 'c']

そう、できない!

これは__doc__sorted()の仕様を見ればわかります。

Return a new list containing all items from the iterable in ascending order.

A custom key function can be supplied to customize the sort order, and the
reverse flag can be set to request the result in descending order.

どうやらsorted()の戻り値はlistで固定されているらしい。

どう実現するのか?

ソート

簡単です。たった1行!

キーで並べ替えたい場合はこれ。

def dict_sorted(d): return {k: d[k] for k in sorted(d)}
dict_sorted(d)
# {'a': 1, 'b': -4, 'c': 3}

値で並べ替えたい場合はこれ。key=d.getを追加します。

def dict_sorted_by_val(d): return {k: d[k] for k in sorted(d, key=d.get)}
dict_sorted_by_val(d)
# {'b': -4, 'a': 1, 'c': 3}

これと同じようにすると、reversed()も作る。というか、こっちの方が楽。

def dict_reversed(d): return {k: d[k] for k in reversed(d)}
dict_reversed(d)
# {'b': -4, 'c': 3, 'a': 1}

似たようなやり方で辞書の最大値、最小値を取る値のキーも取り出せる。

max(d, key=d.get)
# 'c'
min(d, key=d.get)
# 'b'

さいごに

本当はsort()pip install forbiddentreeで導入したかったけど、どうもうまくいかなかったので、良い方法を見つけ次第、報告したい。