Categories: Python

【Python】辞書の要素を並び替える方法

この記事では、Pythonで辞書の要素を並び替える方法を解説します。

辞書にはsort()メソッドが存在しないため、sorted()関数を使って並び替えを行います。

sorted(iterable, *, key=None, reverse=False)

Linksorted() - 組み込み関数 — Python ドキュメント

それでは、辞書の並び替えについて見ていきましょう!

keyでソートして、keyのみ格納されたリストを返す

sorted()関数の引数に辞書を指定して実行してみる。

d = {'name': '田中太郎', 'age': 20, 'gender': '男'}

sorted_d = sorted(d)
print(sorted_d)

実行結果

['age', 'gender', 'name']

昇順で並び替えされたkeyがリストとして返されました。

keyでソートして(key, value)のリストとして返す

sorted()関数の引数に辞書のitems()メソッドを指定して実行する。

d = {'name': '田中太郎', 'age': 20, 'gender': '男'}

sorted_d = sorted(d.items())
print(sorted_d)

実行結果

[('age', 20), ('gender', '男'), ('name', '田中太郎')]

辞書ではなく(key, vlaue)を格納したリストとして返される。

valueでソートして(key, value)のリストとして返す

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)を格納したリストです。

辞書として扱いたい場合

辞書をkeyvalueでソートして辞書として扱いたい場合、辞書の要素を並び替えることはめんどうなので並び替えた要素から新しく辞書を生成します。

ただし、辞書が挿入順序を記憶するようになったのは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}]
ゆうまる

独学でプログラミングを勉強しているおじさん。いろんな言語を勉強したが浅く広くなためあまり仕事につながらない。また忘れっぽいため自分のブログを備忘録としても使っている。産まれてこのかたずっとネコを飼ってる生粋のネコ派。最近お腹が出てきて筋トレに奮闘中!

Recent Posts

【Dart】コンストラクタのデフォルト引数について

Dartのコンストラクタのデフォルト引数…

2週間 ago

【Unity】有料アセットを無料で手に入れる方法

この記事では、Unityの有料アセットを…

4か月 ago

【Python】任意の秒数だけ処理を一時停止する方法【sleep()関数】

この記事では、Pythonで任意の秒数だ…

1年 ago

【Python】Wordの文書の新規作成と読み書き

この記事では、Pythonを使ってWor…

1年 ago

【Python】メタクラスって結局なんなの?

この記事では、Pythonのメタクラスに…

1年 ago