python キーや値でソートしたdict(辞書)を作成する方法

キーや値でソートした辞書を作成する方法を説明します。辞書の順序が挿入順であることを利用しています。
そのため、辞書の順序が挿入順であることを説明した後に、辞書のソートについて説明します。

事前知識

辞書の順序は挿入順

python3.7から辞書の順序が挿入順であることが保証されるようになりました。組み込み型 — Python 3.9.4 ドキュメント class dictの下部参照。

辞書の順序は挿入順であり、キーによって自動でソート等されていません。

#①
d = {}
d[2] = 22
d[3] = 33
d[1] = 11
print(d)
"""出力
{2: 22, 3: 33, 1: 11}
"""

#②
d = {3:33, 1:11, 2:22}
print(d)
"""出力
{3: 33, 1: 11, 2: 22}
"""

#③
print(d.items())
"""出力
dict_items([(3, 33), (1, 11), (2, 22)])
"""
d = dict(d.items())
print(d)
"""出力
{3: 33, 1: 11, 2: 22}
"""

#④
d = {"b":33, "a":11, "c":22}
print(d)
"""出力
{'b': 33, 'a': 11, 'c': 22}
"""
  • ①:d[キー] = 値 の様に辞書に要素を追加した場合は、 上から順に辞書に追加されます。
  • ②:d = {キー:値, ~} の様に辞書に要素を追加した場合は、左から順に辞書に追加されます。
  • ③:items()により「[(キー1、値1), (キー2, 値2)~]」の様なタプルのリストを作成し、辞書を追加する場合は、左から順に辞書に追加されます。
  • ④:文字列の場合も②の数値の場合と同様です。

dict(辞書.items 関数 )とすることができる理由

理由は下記です。 

  • dict 関数 は、各要素が2個のオブジェクトを持つイテラブルを引数とすることができます。組み込み型 — Python 3.9.4 ドキュメント
  • items 関数 は、オブジェクトが2個(キー, 値)のタプルのリスト(イテラブル)を返す。

キーでソート

キーでソートする流れは下記です。

  • dictionary.items関数によってタプル(キー, 値)のリストを生成。
  • 上記リストをsorted 関数 によって昇順にソート(*1)。sorted関数のkey引数を指定しない場合、sorted関数にiterable引数にタプルのリストを渡すと1番目の要素であるキーでソートされます。
  • 上記ソートしたリストをdict関数の引数として与える。この時、辞書の順序は挿入順なので、作成される辞書の順序はソート後の順書になっております。
d = {3:33, 1:11, 2:22}
print(d)
"""出力
{3: 33, 1: 11, 2: 22}
"""
d = dict(sorted(d.items()))
print(d)
"""出力
{1: 11, 2: 22, 3: 33}
"""

d = {"b":33, "a":11, "c":22}
print(d)
"""出力
{'b': 33, 'a': 11, 'c': 22}
"""
d = dict(sorted(d.items()))
print(d)
"""出力
{'a': 11, 'b': 33, 'c': 22}
"""

値でソート

値でソートする流れは下記です。

  • dictionary.items関数によってタプル(キー, 値)のリストを生成。
  • 上記リストをsorted 関数 によって昇順にソート。key=lambda t: t[1]によって、dのインデックス1の要素(値)でソートします。
  • 上記ソートしたリストをdict関数の引数として与える。この時、辞書の順序は挿入順なので、作成される辞書の順序はソート後の順書になっております。
d = {3:5, 1:7, 2:6}
print(d)
"""出力
{3: 5, 1: 7, 2: 6}
"""
d = dict(sorted(d.items(), key=lambda t: t[1]))
print(d)
"""出力
{3: 5, 2: 6, 1: 7}
"""

d = {3:"d", 1:"f", 2:"e"}
print(d)
"""出力
{3: 'd', 1: 'f', 2: 'e'}
"""
d = dict(sorted(d.items(), key=lambda t:t[1]))
print(d)
"""出力
{3: 'd', 2: 'e', 1: 'f'}
"""

参考

python – How can I sort a dictionary by key? – Stack Overflow
キーや値でdictをソートする様々な方法

コメント

タイトルとURLをコピーしました