この記事では、Pythonで辞書の要素を並び替える方法を解説します。
辞書にはsort()
メソッドが存在しないため、sorted()
関数を使って並び替えを行います。
sorted(iterable, *, key=None, reverse=False)
Linksorted() - 組み込み関数 — Python ドキュメント
それでは、辞書の並び替えについて見ていきましょう!
sorted()
関数の引数に辞書を指定して実行してみる。
d = {'name': '田中太郎', 'age': 20, 'gender': '男'}
sorted_d = sorted(d)
print(sorted_d)
実行結果
['age', 'gender', 'name']
昇順で並び替えされたkey
がリストとして返されました。
sorted()
関数の引数に辞書のitems()
メソッドを指定して実行する。
d = {'name': '田中太郎', 'age': 20, 'gender': '男'}
sorted_d = sorted(d.items())
print(sorted_d)
実行結果
[('age', 20), ('gender', '男'), ('name', '田中太郎')]
辞書ではなく(key, vlaue)
を格納したリストとして返される。
sorted()
関数の第一引数に辞書のitems()
メソッドを指定し、第二引数でラムダを使ってソートする条件を指定することでvalue
でソートできる。
d = {'four': 4, 'three': 3, 'one': 1}
sorted_d = sorted(d.items(), key=lambda v: v[1])
print(sorted_d)
実行結果
[('one', 1), ('three', 3), ('four', 4)]
返される値は辞書ではなく(key, value)
を格納したリストです。
辞書をkey
やvalue
でソートして辞書として扱いたい場合、辞書の要素を並び替えることはめんどうなので並び替えた要素から新しく辞書を生成します。
ただし、辞書が挿入順序を記憶するようになったのはPython 3.7からです。 それ以前のバージョンを使いたい場合は、OrderedDict()クラスを使ってください。
辞書の要素をソートして返された(key, value)
のリストを辞書の内包表記に渡すだけでソートされた辞書が生成できます。
d = {'name': '田中太郎', 'age': 20, 'gender': '男'}
sorted_d = sorted(d.items())
# key でソートされた辞書の生成
d = {k: v for k, v in sorted_d}
print(d)
実行結果
{'age': 20, 'gender': '男', 'name': '田中太郎'}
value
でソートしたい場合は以下の通り。
d = {'four': 4, 'three': 3, 'one': 1}
sorted_d = sorted(d.items(), key=lambda v: v[1])
# value でソートされた辞書の生成
d = {k: v for k, v in sorted_d}
print(d)
実行結果
{'one': 1, 'three': 3, 'four': 4}
順序付き辞書は内包表記が使えないのでfor文で初期化。
from collections import OrderedDict
d = {'name': '田中太郎', 'age': 20, 'gender': '男'}
sorted_d = sorted(d.items())
# 順序付き辞書の生成
o = OrderedDict()
# 初期化
for k, v in sorted_d:
o[k] = v
print(o)
実行結果
OrderedDict([('age', 20), ('gender', '男'), ('name', '田中太郎')])
リストに格納された辞書もソートすることができます。以下のコードではscore
キーで並び替えしています。
scores = [
{'name': '朝倉', 'score': 91},
{'name': 'ジョン・スミス', 'score': 63},
{'name': '谷口', 'score': 34},
]
sort_scores = sorted(scores, key=lambda v: v['score'])
print(sort_scores)
実行結果
[{'name': '谷口', 'score': 34}, {'name': 'ジョン・スミス', 'score': 63}, {'name': '朝倉', 'score': 91}]