今回は、Pythonの辞書のリストをソート(並び替える)する方法についてご紹介します。
Pythonの辞書リストをソートする基本
まず、Pythonではsorted関数とlist.sort()メソッドの2種類の方法でソートが可能です。
sorted関数は、新しいソート済みリストを返すため、元のリストは変更されません。
一方、list.sort()メソッドはリスト自体をインプレースで変更するため、元のリストが書き換わります。
用途に応じて使い分けることが重要です。
sorted関数
以下の例では、年齢(age)を基準にソートします。
1 2 3 4 5 6 7 8 |
data = [ {'name': 'Alice', 'age': 30}, {'name': 'Bob', 'age': 25}, {'name': 'Charlie', 'age': 35} ] sorted_data = sorted(data, key=lambda x: x['age']) print(sorted_data) |
[{‘name’: ‘Bob’, ‘age’: 25}, {‘name’: ‘Alice’, ‘age’: 30}, {‘name’: ‘Charlie’, ‘age’: 35}]
元のdataは変更されず、新しいリストsorted_dataがソートされています。
list.sort()メソッド
sorted関数とは異なり、元のリストを直接変更します。
1 2 |
data.sort(key=lambda x: x['age']) print(data) |
[{‘name’: ‘Bob’, ‘age’: 25}, {‘name’: ‘Alice’, ‘age’: 30}, {‘name’: ‘Charlie’, ‘age’: 35}]
リスト自体が書き換わるため、元のdataもソート済みの状態になっています。
ソートキーの指定と複数キーの使用
辞書のリストをソートする際、複数のキーを使ったり、降順でソートする場面があります。
ソートのkeyパラメータに渡す関数を工夫することで、柔軟なソートが可能です。
単一キーでのソート
最も基本的な形がlambda x: x[‘age’]のように、単一キーを指定する方法です。
また、operator.itemgetterを使う方法もあります。
1 2 3 |
import operator sorted_data = sorted(data, key=operator.itemgetter('age')) |
このように記述すると、同様に年齢を基準にソートできます。
複数キーでのソート
複数のキーを考慮したい場合、タプルとして返す関数をkeyに指定します。
1 2 3 4 5 6 7 8 9 |
data = [ {'name': 'Alice', 'age': 30}, {'name': 'Bob', 'age': 25}, {'name': 'Charlie', 'age': 30}, {'name': 'Dave', 'age': 25} ] sorted_data = sorted(data, key=lambda x: (x['age'], x['name'])) print(sorted_data) |
[{‘name’: ‘Bob’, ‘age’: 25}, {‘name’: ‘Dave’, ‘age’: 25}, {‘name’: ‘Alice’, ‘age’: 30}, {‘name’: ‘Charlie’, ‘age’: 30}]
最初に年齢(age)を比較し、同じ年齢なら名前(name)を比較してソートしています。
降順ソート
ソートを逆順にしたい場合は、reverse=Trueを指定します。
1 2 |
sorted_data = sorted(data, key=lambda x: x['age'], reverse=True) print(sorted_data) |
[{‘name’: ‘Charlie’, ‘age’: 35}, {‘name’: ‘Alice’, ‘age’: 30}, {‘name’: ‘Bob’, ‘age’: 25}]
年齢が大きい順に並び替えることができます。
特殊なケースとよくあるエラー対策
辞書のキーが存在しない場合や、ソート対象のデータ型が混在している場合に注意が必要です。
ここではエラーを回避するための対策を紹介します。
キーが存在しない場合
辞書の中に存在しないキーを使ってソートを行うと、エラーが発生する可能性があります。
以下のように、dict.getを使ってデフォルト値を設定することで回避できます。
1 2 3 4 5 6 7 8 |
data = [ {'name': 'Alice', 'age': 30}, {'name': 'Bob'}, {'name': 'Charlie', 'age': 25} ] sorted_data = sorted(data, key=lambda x: x.get('age', 0)) print(sorted_data) |
[{‘name’: ‘Bob’}, {‘name’: ‘Charlie’, ‘age’: 25}, {‘name’: ‘Alice’, ‘age’: 30}]
存在しない場合は0として扱い、ソートを実施します。
カスタムソート関数
単純なキー指定ではなく、複雑な条件でソートしたい場合は関数を定義し、keyに渡します。
1 2 3 4 5 |
def custom_sort(item): return (len(item['name']), item.get('age', 0)) sorted_data = sorted(data, key=custom_sort) print(sorted_data) |
上記では、名前の長さと年齢を組み合わせた独自のソートを実現しています。
データ型の混在
数値や文字列など、型が混在していると比較不能となり、エラーが出ることがあります。
ソート対象のキーの値を統一する、または型変換の処理を挟むことで対策が可能です。
まとめ
Pythonの辞書リストをソートする際は、sorted関数とlist.sort()メソッドを使い分けることで目的に合ったソートが可能です。
ソート時にはkeyパラメータで柔軟に条件を設定でき、複数キーやカスタム関数などの応用もできます。
エラーを回避するためにはキーの存在やデータ型の一貫性に注意し、必要に応じて対策を行うことが重要です。