Python 辞書のソート: 解説と例
Python辞書は、データをキーと値のペアとして格納する便利なデータ構造です。
しかし、辞書はデフォルトでは順序付けされておらず、辞書内のデータを特定の順序でソートする必要があることがあります。
この記事では、Python辞書をソートする方法を見ていきます。 以下はその具体的な方法です。
- キーでソートする
- 値によるソート(ラムダ関数)
- 複数の値または降順でソートする。
- 複数の辞書をソートする
- Pythonリスト内の辞書のソート
- 辞書出力のソート
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つのトピックを取り上げてきました。 これらが今後の実作業に役立つことを願っています。
