🐍 Python

辞書を値でソートする

辞書には「値で並べ替える」専用メソッドはありません。sorted()関数にitems()とkey引数(何を基準に比較するか)を組み合わせるのが定石パターンです。

sorted(d.items(), key=lambda item: item[1])          # 値の昇順
sorted(d.items(), key=lambda item: item[1], reverse=True) # 値の降順
scores = {"alice": 80, "bob": 95, "carol": 70}
by_value = sorted(scores.items(), key=lambda item: item[1])
print(by_value)
# [('carol', 70), ('alice', 80), ('bob', 95)]
# reverse=Trueで降順にする
scores = {"alice": 80, "bob": 95, "carol": 70}
by_value_desc = sorted(scores.items(), key=lambda item: item[1], reverse=True)
print(by_value_desc)
# [('bob', 95), ('alice', 80), ('carol', 70)]
# keyを省略するとキーの辞書順になる(値ではない点に注意)
scores = {"alice": 80, "bob": 95, "carol": 70}
by_key = sorted(scores.items())
print(by_key)
# [('alice', 80), ('bob', 95), ('carol', 70)]
# 最大値だけ欲しいならmax()にも同じkeyが使える
scores = {"alice": 80, "bob": 95, "carol": 70}
top1 = max(scores.items(), key=lambda item: item[1])
print(top1)
# ('bob', 95)

# ソート結果を辞書に戻したいときはdict()で包む
sorted_dict = dict(sorted(scores.items(), key=lambda item: item[1], reverse=True))
print(sorted_dict)
# {'bob': 95, 'alice': 80, 'carol': 70}
key引数の考え方
item[1]
items()が返す(キー, 値)のタプルのうち、インデックス1、つまり値を比較対象に指定する
reverse=True
比較の向きを逆にするだけで、キーと値の対応関係自体は変わらない
💡 AIコードレビュー観点:Python 3.7以降、辞書は挿入順を保持する

辞書のキー自体には「大小関係による自動ソート」はありません。dict(sorted(...))で作った辞書は、Python 3.7以降であれば渡した順序(この場合は値の大きい順)がそのまま保持されます。ただし、辞書は「値で自動的にソートされ続ける」わけではなく、その後に新しいキーを追加すれば末尾に挿入されるだけで、並び順は自動的には維持されません。「常に値順で見たい」なら、都度sorted()し直す必要があります。

← Python dict クイックリファレンス一覧へ戻る / keys/values/itemsで中身を取り出す →