Pythonの辞書(dict)はキーと値の組み合わせでデータを格納できる変数です。
今回は、辞書のキーまたは値をソートした状態で取り出す方法を解説しています。
- 辞書のキー(keys)をソートして取得
- 辞書の値(values)をソートして取得
- 辞書のキー・値のセットをソートして取得
- 辞書のリストをソートする
なお、最後のリストのリスト(多次元リスト)や辞書のリストをソートすることもよくあります。そちらについては別のページでまとめています。
結論
辞書のキーをソートして取得(sorted()
にそのまま渡す)
d = {2:'foo', 1:'bar', 3:'baz'}
print(sorted(d))
# [1, 2, 3]
辞書の値をソートして取得(dict.values()
をsorted()
に渡す)
d = {1:'b', 2:'a', 3:'c'}
print(sorted(d.values()))
# ['a', 'b', 'c']
キー・値のセットをソートして取得
d = {2:'c', 1:'b', 3:'a'}
print(sorted(d.items()))
# [(1, 'b'), (2, 'c'), (3, 'a')]
辞書のリストをソートする
d_sorted = sorted(dict_items, key=lambda x: x['key_to_sort'])
実行環境
Python 3.9.2
辞書のキー・値をソートして取得
辞書のキーまたは値をソートして取得したい場合、リスト(list)と同じように組み込み関数 sorted()
を用います。
sorted()
は渡した引数(リストなどのシーケンシャルな変数)をソートしたものを返します。
l = [1, 3, 2, 4]
print(sorted(l))
# [1, 2, 3, 4]
キーをソートして取得
辞書のキーをソートして取得したい場合は、sorted()
に辞書そのものを渡します。戻り値はソートされたキーのリストです。
d = {2:'foo', 1:'bar', 3:'baz'}
print(d)
# {2: 'foo', 1: 'bar', 3: 'baz'}
# 辞書そのものを渡すとソートされたキーが返される
keys = sorted(d)
print(keys)
# [1, 2, 3]
辞書のキーは dict.keys()
メソッドから取得できるので、以下のように書いても同じ結果となります。
# 辞書のキーをsorted()に渡すのと同じ結果となる
print(d.keys())
# dict_keys([2, 1, 3])
keys = sorted(d.keys())
print(keys)
# [1, 2, 3]
もちろん、キーが数値以外の場合でも、ソートした結果が得られます。
# キーが数値以外でもソート可能
d = {'b':'foo', 'a':'bar', 'c':'baz'}
print(d)
# {'b': 'foo', 'a': 'bar', 'c': 'baz'}
keys = sorted(d)
print(keys)
# ['a', 'b', 'c']
値をソートして取得
辞書の値(values)をソートした状態で取得したいときは、値のセットを取得するdict.values()
を利用します。
d = {1:'b', 2:'a', 3:'c'}
print(d.values())
# dict_values(['b', 'a', 'c'])
sorted()
に dict.values()
を渡せば期待するリストが得られます。
vals = sorted(d.values())
print(vals)
# ['a', 'b', 'c']
キー・値のセットをソートして取得
実際には辞書のキーと値をセットで取得したい場合が多いでしょう。
キー・値のセットを、ある基準でソートして取得するには、dict.items()
を sorted()
に渡します。このとき、戻り値はキーでソートされたリストが返されます。
d = {2:'c', 1:'b', 3:'a'}
# items()をそのまま渡すと、ソートはキー基準
items = sorted(d.items())
print(items)
# [(1, 'b'), (2, 'c'), (3, 'a')]
キーではなく、値を基準にしてソートしたいときは、引数key
を指定します。key
にはソート基準とする要素に処理を行う呼び出し可能オブジェクト(関数)を渡します。ここでは、ラムダ式(無名関数)でシンプルに記述しています。
# 値基準でソートする場合は引数keyを指定する
items = sorted(d.items(), key=lambda x: x[1])
print(items)
# [(3, 'a'), (1, 'b'), (2, 'c')]
メモ
上述したラムダ式は以下のdef
で定義した関数と同じです。
def val(item: tuple) -> Any:
return item[1]
items = sorted(d.items(), key=val)
print(items)
# [(3, 'a'), (1, 'b'), (2, 'c')]
辞書のリストをソートする
ここまでは辞書の各要素(キー・値)をソートして取り出す方法を解説してきましたが、要素が辞書であるリスト(辞書のリスト)をソートしたい場合もあります。
実はこの場合もsorted()
関数でシンプルにコードが書けます。
例えば次のような辞書のリストを考えます。
d = [
{'id':1, 'name':'Albert', 'score':60},
{'id':2, 'name':'Lexie', 'score':55},
{'id':3, 'name':'Chang', 'score':70},
{'id':4, 'name':'Deanna', 'score':49},
]
sorted()
にリストを渡すことでソートができるのですが、ソート基準が単にdictだと大小比較ができないため TypeError
となってしまいます。
sorted(d)
# TypeError: '<' not supported between instances of 'dict' and 'dict'
そのため、ソート基準とする辞書のキーを明示します。
ソート基準は引数key
に指定します。
例として、各辞書のキー 'score' でソートしたい場合、以下のようにラムダ式を使ってキーを指示します。
d_sorted = sorted(d, key=lambda x: x['score'])
pprint(d_sorted)
# [{'id': 4, 'name': 'Deanna', 'score': 49},
# {'id': 2, 'name': 'Lexie', 'score': 55},
# {'id': 1, 'name': 'Albert', 'score': 60},
# {'id': 3, 'name': 'Chang', 'score': 70}]
※ここで、pprint()は見やすくするために使用しています。使用にはインポートが必要
from pprint import pprint
なお、辞書のリストをソートする方法について、より詳しくは以下のページを参照。
Pythonで2次元リスト、辞書のリストをキーでソートする方法の完全解説
- キーが欠損している要素に対応する方法
- 複数のキー、値の組み合わせで自由自在にソートする
なども解説しています。
Pythonの学習法について
Python の勉強が辛くなっていませんか?
Pythonは比較的取り組みやすい言語と言われていますが、プログラミング初心者にとっては分からないことだらけ。
ゼロから独学で勉強するのは厳しい道のりです。
今回、様々な現場、システム、言語を経験してきた現役エンジニアの立場から、初心者でも挫折しない学習方法を解説する記事を書きました。もちろん、お金をかけずに習得できる方法も解説しています。
できるだけストレスがかからない勉強法を解説しているので、ぜひ参考にしてみてくださいね。
今回参考にしたページ・資料
sorted() 組み込み関数 — Python 3.10.0b2 ドキュメント
dict 組み込み型 — Python 3.10.0b2 ドキュメント