Python
コンテナデータ型
dict
ソート

Python 辞書のソート: 解説と例

Python辞書は、データをキーと値のペアとして格納する便利なデータ構造です。

しかし、辞書はデフォルトでは順序付けされておらず、辞書内のデータを特定の順序でソートする必要があることがあります。

この記事では、Python辞書をソートする方法を見ていきます。 以下はその具体的な方法です。

  1. キーでソートする
  2. 値によるソート(ラムダ関数)
  3. 複数の値または降順でソートする。
  4. 複数の辞書をソートする
  5. Pythonリスト内の辞書のソート
  6. 辞書出力のソート

1. キーによるソート

辞書をキーでソートするには、組み込み関数 sorted() を使用します。

キーで辞書をソートすると、キーによる順序が保証され、結果を予測しやすくなります。 キーは各キーと値のペアを一意に識別するので、キーによるソートは辞書を素早くナビゲートしたり、必要な情報を見つけるのに役立ちます。

dictionary = {'c': 3, 'a': 1, 'b': 2}
sorted_dict = dict(sorted(dictionary.items()))
print(sorted_dict)
 
# Output
{'a': 1, 'b': 2, 'c': 3}

2. 値によるソート (ラムダ関数)

辞書を値でソートするには、 sorted() 関数の key 引数で lambda 関数を使用します。

辞書を値でソートすることで、値による順序が保証され、値の分布やパターンを見やすくなります。

lambda関数を使うと、値に基づいた条件を簡単に設定することができます。lambda関数は無名関数で、単純な関数を実装するのに便利です。

dictionary = {'a': 3, 'b': 1, 'c': 2}
sorted_dict = dict(sorted(dictionary.items(), key=lambda item: item[1]))
print(sorted_dict)
 
# Output
{'b': 1, 'c': 2, 'a': 3}

3. 複数の値を降順にソートする

3.1. 複数の値による並べ替え

辞書に複数の値がある場合、その値で辞書をソートするのは少し複雑になります。

たとえば、以下のようなキーと値を持つ辞書があるとします。

dict_to_sort = {'a': (2, 3), 'b': (1, 3), 'c': (1, 2), 'd': (2, 2)}

ここでは、値は2つの要素を持つタプルである。キーと最初の要素、そして2番目の要素でソートするには、次のようなコードを書きます。

sorted_dict = dict(sorted(dict_to_sort.items(), key=lambda item: (item[0], item[1][0], item[1][1])))
 
print(sorted_dict)
 
# Output
{'b': (1, 3), 'c': (1, 2), 'a': (2, 3), 'd': (2, 2)}

key=lambda item: (item[0], item[1][0], item[1][1]) の部分はソートキーを指定するコードです。

ここで、item[0]は辞書のキーを表し、item[1][0]は辞書の値であるタプルの最初の要素を表し、item[1][1]は辞書の値であるタプルの2番目の要素を表す。

つまり、このコードは辞書をキーでソートし、次にタプルの最初の要素でソートし、次に2番目の要素でソートする。

このように、辞書の値を構成する各要素をソートの基準として使用して、複数の値で辞書をソートできます。

3.2. 降順での並べ替え

辞書を降順にソートするには、 sorted() 関数の reverse 引数を True に設定します。

例えば、以下のような辞書があるとします。

my_dict = {'b': 5, 'a': 9, 'c': 7}

この辞書をキーの降順で並べ替えるには、次のようにします。

sorted_dict = dict(sorted(my_dict.items(), key=lambda item: item[0], reverse=True))
 
print(sorted_dict)
 
# Output
{'c': 7, 'b': 5, 'a': 9}

同様に、この辞書を値の降順で並べ替えるには、以下のようにする。

sorted_dict = dict(sorted(my_dict.items(), key=lambda item: item[1], reverse=True))
 
print(sorted_dict)
 
# Output
{'a': 9, 'c': 7, 'b': 5}

ここで key=lambda item: item[0] または key=lambda item: item[1] はソート基準を指定するコードです、 reverse=True はこの基準で降順にソートするよう辞書に指示します。

4. 複数の辞書のソート

辞書の中に別の辞書がある場合、それは "入れ子辞書 "と呼ばれます。 入れ子辞書は、データを階層的に構造化するのに便利であり、JSONのようなデータ形式でよく見られる。

しかし、入れ子辞書のソートは少し厄介です。外側の辞書のキーでソートするか、内側の辞書のキーまたは値でソートする必要があります。

たとえば、以下のように、"username "をキーとし、"age "と "address "を値とする辞書を持つ入れ子辞書があるとします。

nested_dict = {'John': {'age': 25, 'address': '123 St'},
                'Jane': {'age': 23, 'address': '456 St'},
                'Dave': {'age': 30, 'address': '789 St'}}

この入れ子になった辞書を「年齢」でソートするには、次のようなコードを書けばよい。

sorted_dict = dict(sorted(nested_dict.items(), key=lambda item: item[1]['age']))
print(sorted_dict)
 
# Output
{'Jane': {'age': 23, 'address': '456 St'},
'John': {'age': 25, 'address': '123 St'},
'Dave': {'age': 30, 'address': '789 St'}}

key=lambda item: item[1]['age'] の部分は、'age' でソートを行うためのソートキーを指定するコードです。 この場合、item[1]は辞書の値を表し、それは別の辞書である。

つまり、item[1]['age']はネストした辞書から'age'の値を取得するコードになります。

このようにネストした辞書を整理することで、各レベルに応じたデータの理解や管理が容易になります。 もちろん、ネストレベルが深くなればなるほど、ソートは複雑になりますが、同じ原理が適用されます。

5. Pythonリスト内での辞書のソート

リスト内の辞書をソートするには、key 引数にソートしたい辞書のキーを指定します。

list_of_dict = [{'name': 'John', 'age': 25}, {'name': 'Jane', 'age': 23}, {'name': 'Dave', 'age': 30}]
sorted_list_of_dict = sorted(list_of_dict, key=lambda d: d['age'])
 
print(sorted_list_of_dict)
 
# Output
[{'name': 'Jane', 'age': 23}, {'name': 'John', 'age': 25}, {'name': 'Dave', 'age': 30}]

6. ソートされた辞書の出力

辞書をソートして出力するには、for ステートメントを使ってキーと値のペアを繰り返します。

dictionary = {'c': 3, 'a': 1, 'b': 2}
sorted_dict = dict(sorted(dictionary.items()))
 
for key, value in sorted_dict.items():
    print(f"{key}: {value}")
 
# Output
a: 1
b: 2
c: 3

結論

ここまで、Python辞書のソートに関連する6つのトピックを取り上げてきました。 これらが今後の実作業に役立つことを願っています。

copyright for Python 辞書のソート: 解説と例

© 2023 All rights reserved.