辞書

[Python] 辞書(dict)のリストをソートする方法

今回は、Pythonの辞書のリストをソート(並び替える)する方法についてご紹介します。

Pythonの辞書リストをソートする基本

まず、Pythonではsorted関数list.sort()メソッドの2種類の方法でソートが可能です。

sorted関数は、新しいソート済みリストを返すため、元のリストは変更されません。

一方、list.sort()メソッドはリスト自体をインプレースで変更するため、元のリストが書き換わります。

用途に応じて使い分けることが重要です。

sorted関数

以下の例では、年齢(age)を基準にソートします。

実行結果

[{‘name’: ‘Bob’, ‘age’: 25}, {‘name’: ‘Alice’, ‘age’: 30}, {‘name’: ‘Charlie’, ‘age’: 35}]

元のdataは変更されず、新しいリストsorted_dataがソートされています。

list.sort()メソッド

sorted関数とは異なり、元のリストを直接変更します。

実行結果

[{‘name’: ‘Bob’, ‘age’: 25}, {‘name’: ‘Alice’, ‘age’: 30}, {‘name’: ‘Charlie’, ‘age’: 35}]

リスト自体が書き換わるため、元のdataもソート済みの状態になっています。

ソートキーの指定と複数キーの使用

辞書のリストをソートする際、複数のキーを使ったり、降順でソートする場面があります。

ソートのkeyパラメータに渡す関数を工夫することで、柔軟なソートが可能です。

単一キーでのソート

最も基本的な形がlambda x: x[‘age’]のように、単一キーを指定する方法です。

また、operator.itemgetterを使う方法もあります。

このように記述すると、同様に年齢を基準にソートできます。

複数キーでのソート

複数のキーを考慮したい場合、タプルとして返す関数をkeyに指定します。

実行結果

[{‘name’: ‘Bob’, ‘age’: 25}, {‘name’: ‘Dave’, ‘age’: 25}, {‘name’: ‘Alice’, ‘age’: 30}, {‘name’: ‘Charlie’, ‘age’: 30}]

最初に年齢(age)を比較し、同じ年齢なら名前(name)を比較してソートしています。

降順ソート

ソートを逆順にしたい場合は、reverse=Trueを指定します。

実行結果

[{‘name’: ‘Charlie’, ‘age’: 35}, {‘name’: ‘Alice’, ‘age’: 30}, {‘name’: ‘Bob’, ‘age’: 25}]

年齢が大きい順に並び替えることができます。

特殊なケースとよくあるエラー対策

辞書のキーが存在しない場合や、ソート対象のデータ型が混在している場合に注意が必要です。

ここではエラーを回避するための対策を紹介します。

キーが存在しない場合

辞書の中に存在しないキーを使ってソートを行うと、エラーが発生する可能性があります。

以下のように、dict.getを使ってデフォルト値を設定することで回避できます。

実行結果

[{‘name’: ‘Bob’}, {‘name’: ‘Charlie’, ‘age’: 25}, {‘name’: ‘Alice’, ‘age’: 30}]

存在しない場合は0として扱い、ソートを実施します。

カスタムソート関数

単純なキー指定ではなく、複雑な条件でソートしたい場合は関数を定義し、keyに渡します。

上記では、名前の長さと年齢を組み合わせた独自のソートを実現しています。

データ型の混在

数値や文字列など、型が混在していると比較不能となり、エラーが出ることがあります。

ソート対象のキーの値を統一する、または型変換の処理を挟むことで対策が可能です。

まとめ

Pythonの辞書リストをソートする際は、sorted関数とlist.sort()メソッドを使い分けることで目的に合ったソートが可能です。

ソート時にはkeyパラメータで柔軟に条件を設定でき、複数キーやカスタム関数などの応用もできます。

エラーを回避するためにはキーの存在やデータ型の一貫性に注意し、必要に応じて対策を行うことが重要です。