Python Tech 辞書

Python 辞書のキー・値をソートして取得する方法

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 ドキュメント

 

  • この記事を書いた人

次世代ペンギン

長いのでペンギンとお呼びください。システム開発・プログラミングのお仕事をしています。甘味とコーヒーは生命線。多くの人に役立つ情報のシェアが目標です。

人気の記事

1

会社員でプログラマーとして働いている人、インフラやネットワークのエンジニアとして働いている人の中には、フリーランスのプログラマーとして独立、もしくは転向したい人もいるので ...

2

キャリアアップのため、または高収入を目指して、しっかりプログラミングを学びたいという人が増えてきましたね。 この記事では現役のエンジニアである私が、実際に仕事で稼げるよう ...

3

フリーランスのプログラマーにとって収入の向上に最も直結するのはスキルです。 必要なスキル、スキルの獲得方法が気になる人も多いでしょう。 また、これからフリーランスを目指す ...

4

Vuetifyの v-progress-circular コンポーネントは、数値データや処理状況を環状(円状)のデザインで教えてくれるUIデザインです。 ローディングのス ...

5

Vuexのstore(ストア)を使うと、各コンポーネント間で個別にデータのやり取りすることなく、データを一元的に管理できます。Vueでは欠かせない機能といえるでしょう。 ...

-Python, Tech, 辞書
-, ,

© 2021 ペンギンのーと