【Python】dict(辞書)の sort (並び替え)方法をわかりやすく解説!
はじめに
Pythonの 辞書 (dict)は、キーと値のペアを管理するためにとても便利なデータ構造です。 しかし、リストとは異なり、そのままでは順番が固定されないため、並び替えが必要になるケースがあります。 例えば、在庫管理システムで商品と価格を対応づけたり、ユーザー情報をIDと名前のペアで保持したりと、実務で辞書が活用されるシーンは多いでしょう。
そこで本記事では、Pythonの辞書を 並び替え (ソート)する方法をわかりやすく解説します。 初心者の方でも理解しやすいよう、基本のコード例から少し応用的な活用例まで順を追って紹介していきます。
この記事を読むとわかること
- Pythonの辞書を並び替える方法の概要
- キーや値、複合条件でソートする方法
- 実務での活用シーン(例:商品データや社員情報など)
- エラーや想定外の動作を防ぐためのポイント
辞書(dict)とは何か
辞書は、リストと同じように複数の値を1つの変数にまとめて管理できるデータ型の一種です。 しかし、リストが要素の並び順(インデックス)によって値を管理するのに対し、辞書はキーと値で管理します。
以下は、辞書を使う例です。
# 商品名と在庫数を管理する例 inventory = { "Apple": 50, "Banana": 25, "Orange": 75 }
ここでは "Apple" や "Banana" がキー、50 や 25 が値です。 在庫リストを持つ時、どの商品が何個在庫として残っているかを素早く検索できます。
一方で、辞書のようにキーと値でデータを保持していると、単純な昇順や降順で並び替えたい時にどうすれば良いのか迷うことがあります。 次のセクションから、具体的なソート方法を見ていきましょう。
Python辞書の並び替えが必要となる場面
辞書の並び替えは、例えば次のような実務的な場面で必要になるかもしれません。
- 顧客情報を「名前順」や「顧客ID順」で並び替えたい
- 商品リストを「価格が低い順」で並び替えたい
- 成績表を「得点の高い順」で並び替えたい
リストを使えば簡単な並び替えができる一方、キーと値の関係を保持したまま並び替えたい場合は、少し工夫が必要です。 Pythonの標準的なアプローチとしては、組み込み関数などを使うことで実装できます。
辞書の基本的な並び替え方法
Pythonには辞書そのものを直接並び替える方法はなく、ソートした結果を新しいデータとして利用する形が一般的です。
ここでは、初心者の方にもわかりやすいよう、sorted()
関数を使ったアプローチをご紹介します。
キーでソートする
以下のコード例では、辞書のキーを使って並び替えを行い、新しい辞書を作っています。
# 辞書のキーでソートする例 unsorted_dict = { "Banana": 25, "Orange": 75, "Apple": 50 } sorted_keys = sorted(unsorted_dict.keys()) # キーをソート sorted_dict_by_key = {} for key in sorted_keys: sorted_dict_by_key[key] = unsorted_dict[key] print(sorted_dict_by_key) # 出力: {'Apple': 50, 'Banana': 25, 'Orange': 75}
sorted_keys
には、"Apple", "Banana", "Orange" のように、ソートされたキーのリストが入ります。
その後、ループを使って新しい辞書に要素を入れ直すことで、キーの順番が揃った辞書が完成します。
実務では、キーが商品コードや顧客IDなどに相当するケースがあります。 例えば、数字のIDでソートしたい場合には、この方法が役立つでしょう。
値でソートする
次に、値を元に辞書をソートする方法です。 並び替えの基準がキーではなく、値である点に注意してください。
# 辞書の値でソートする例 unsorted_dict = { "Apple": 50, "Banana": 25, "Orange": 75 } # sorted関数にkeyパラメータを設定する sorted_items = sorted(unsorted_dict.items(), key=lambda x: x[1]) sorted_dict_by_value = {} for k, v in sorted_items: sorted_dict_by_value[k] = v print(sorted_dict_by_value) # 出力: {'Banana': 25, 'Apple': 50, 'Orange': 75}
sorted(unsorted_dict.items(), key=lambda x: x[1])
では、タプル (キー, 値)
のリストを値 (x[1]
) で並び替えています。
また、ループで新しい辞書 sorted_dict_by_value
を組み立てています。
実際には、社員の評価スコアや商品価格など、値をベースにしたソートが必要になるケースが多いでしょう。
このように、sorted()
の key
引数を適切に使うことで、柔軟に並び替えができます。
昇順・降順の切り替え
ソート方法として、昇順と降順を切り替えたい場合は、sorted()
関数に reverse=True
を指定します。
次の例では、値で並び替えを行い、降順に並べています。
unsorted_dict = { "Apple": 50, "Banana": 25, "Orange": 75 } sorted_items_desc = sorted( unsorted_dict.items(), key=lambda x: x[1], reverse=True ) sorted_dict_desc = {} for k, v in sorted_items_desc: sorted_dict_desc[k] = v print(sorted_dict_desc) # 出力: {'Orange': 75, 'Apple': 50, 'Banana': 25}
こうすると、最大の値から順番に並ぶので、例えば「売上が大きい店舗の順に並べたい」などの実務シーンに役立ちます。
複合条件で並び替える
現場では、「まず値が高い順に並べて、同じ値の時はキーのアルファベット順」といったように、複合的な並び替えを求められる場合があります。
その時も、sorted()
関数の key
パラメータを工夫すれば実現可能です。
以下の例では、値を降順、その後キーを昇順にしています。
unsorted_dict = { "Banana": 50, "Apple": 50, "Orange": 75, "Grapes": 75 } # 値を降順、同じ値ならキーが昇順になるようにする sorted_items = sorted( unsorted_dict.items(), key=lambda x: (-x[1], x[0]) ) sorted_dict_complex = {} for k, v in sorted_items: sorted_dict_complex[k] = v print(sorted_dict_complex) # 出力: {'Grapes': 75, 'Orange': 75, 'Apple': 50, 'Banana': 50}
ここでは、タプル (-x[1], x[0])
を返すようにしているので、まず値をマイナスにして降順にし、次にキーを通常の昇順に並べ替えています。
このように、一度に多段階のソートが必要な場合でも、sorted()
関数で柔軟に指定できるわけですね。
実務レベルで意識しておきたいポイント
辞書を並び替える時に気をつけておきたいポイントや実務での考慮事項をいくつかまとめます。
1. もともとの順序を上書きしない
Pythonでは、並び替えをするときに新しい辞書を生成する方法が主流です。 もともとの辞書が持つ順序に依存している箇所があると、思わぬ不具合を起こしかねません。 並び替え前後で、他の処理が必要かどうかを確認するようにしましょう。
2. 処理コストを確認する
辞書を並び替えるには、キーや値のリストを取得したり、タプルのリストとして扱ったりすることになります。 データ量が非常に多いケースでは、ソートのコストを考慮しましょう。 特にリアルタイムでデータを更新し続けるシステムでは、ソート回数を最適化することが必要になるかもしれません。
3. データ構造を見直す
「本当に辞書で管理する必要があるのか」「リストの中に辞書をネストする形が良いのではないか」など、使い方によってはデータ構造を再検討すると良い場合があります。 並び替えが頻繁に必要であれば、最初からリストを使って管理した方がわかりやすいこともあります。
4. 文字コードや大文字・小文字の扱い
キーが文字列の場合、大文字・小文字や特殊文字が混ざっていると、思った通りにソートされないことがあります。 ソート基準を明確にしておくと、後々トラブルを防止しやすいでしょう。
もし文字列の比較ルールが複雑な場合は、key
パラメータに比較用の関数を適用するなどの工夫で対応できます。
ソート結果をリストで扱う方法
実務では、並び替えた後のデータをそのまま辞書ではなく、リストとして使いたい場面もあるでしょう。 例えば、テーブル表示するために [ (キー, 値), (キー, 値), ... ] の形のリストが欲しい場合などです。
unsorted_dict = { "Cherry": 10, "Banana": 5, "Apple": 20 } # キーを基準に昇順ソートし、リストで扱う sorted_list = sorted(unsorted_dict.items(), key=lambda x: x[0]) print(sorted_list) # 出力: [('Apple', 20), ('Banana', 5), ('Cherry', 10)] # テーブル表示やループ処理などで使いやすい形 for item in sorted_list: print("商品名:", item[0], "在庫:", item[1])
このように、並び替えた結果を辞書ではなくリストのまま扱うと、各要素を順番に処理しやすくなります。 特に、Webアプリケーションのフロントエンドにデータを渡す時、JSON形式で並び順を保持したリストを送ることもよくあるパターンです。
辞書のsortメソッドは存在する?
リストには list.sort()
というメソッドが用意されていますが、辞書のメソッドとしては dict.sort()
というものはありません。
dict
はリストと異なる構造をしているため、並び替え機能を直接持っていないわけです。
そのため、辞書をソートしたい場合には先ほど紹介したように sorted()
関数を使い、新しいデータ構造(辞書やリスト)を作るのがPythonでは一般的なやり方です。
「なぜ辞書に sort()
がないのか?」と疑問に思うかもしれませんが、辞書には並び順とは別の利用価値(ハッシュマップ構造による高速なキー検索など)があることを押さえておくと良いでしょう。
実務での活用事例:売上データの並び替え
ここでは、実際に売上データを管理する簡単な例を紹介します。 売上データ(店舗名: 売上高)の辞書を、売上高が高い順に並べ替えるケースを考えてみましょう。
sales_data = { "Tokyo": 250000, "Osaka": 180000, "Nagoya": 220000, "Fukuoka": 150000 } # 売上高が高い順に並び替え sorted_sales = sorted( sales_data.items(), key=lambda x: x[1], reverse=True ) print("売上が高い店舗順で表示:") for store, sales in sorted_sales: print(store, ":", sales)
このコードでは、sales_data
を sorted()
関数で降順ソートし、結果をリストとして利用しています。
実務ではこのデータを元に、上位店舗だけを表示したり、ランキング形式でレポートを作成したりできます。
辞書の並び替えにこだわりすぎると、より適したデータ構造を見逃すことがあります。 ソートの条件や頻度を考慮しつつ、最適な方法を選ぶことが大切です。
トラブルシューティング
以下は、初心者の方が躓きやすいポイントと、その対処方法です。
ソートしても順番が変わらない
辞書を sorted()
した結果を受け取らず、そのまま sorted(unsorted_dict)
だけを書いている場合があります。
sorted()
は新しいオブジェクトを返すので、単に sorted(unsorted_dict)
を呼ぶだけでは元の辞書は変わりません。
新しい変数に代入するか、処理結果を明示的に使うようにしましょう。
ソートの基準が思ったとおりにならない
key=lambda x: x[0]
と key=lambda x: x[1]
を混同すると、キー基準なのか値基準なのか分からずにバグが起こりやすいです。
「どういう並びにしたいのか」を整理したうえで、key
関数をしっかり指定しましょう。
辞書のキーが数値なのに文字列として扱われる
CSVファイルなどから読み込んだデータを辞書に変換すると、数値が文字列型になっている場合があります。
文字列としてソートされるので、数値としてソートしたい時は型変換を行う必要があります。
例: int(x[0])
や float(x[1])
を使うなど。
まとめ
辞書の並び替え(ソート)は、Pythonで重要な操作のひとつです。 実務では、商品の在庫管理や売上ランキング、顧客データ管理など、さまざまなシーンで活用されます。
- 辞書そのものに
sort()
はなく、sorted()
関数を使う - 昇順や降順、複合条件でのソートも自由自在
- 並び替えは新しいデータ構造を生成するため、元の辞書に影響はない
- 値の多い辞書や複雑なソート条件がある場合は、処理コストやデータ構造を再検討すると良い
初心者の方は、まずは sorted()
を使ってキー・値をソートするコードを書いてみることから始めてみてください。
並び替えの仕組みと使い方がわかれば、実務でも役立つ機会は多いはずです。