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
で導入したかったけど、どうもうまくいかなかったので、良い方法を見つけ次第、報告したい。
- 前の記事
PIL.ImageGrabの仕様がひどすぎたのでスクリーンショットを自作した 2021.02.21
- 次の記事
PyPIで提供されているnature-remoの中身を見てみた話 2021.02.25