Pythonで辞書を値順にソートする方法|sorted()の基本から応用まで
Pythonの辞書(dict)は、キーと値をペアにしてデータを格納するマッピング型のデータ構造です。辞書そのものには順序の概念がなく、関連するデータ同士をキーと値の組み合わせとして管理します。
組み込み関数のsorted()を使えば、辞書の中身を値の基準で並べ替えることができます。たとえば、カフェのメニュー商品の人気ランキングを作りたい場合などに、sorted()が活躍します。この記事では、sorted()の仕組みと、辞書を値でソートする具体的な方法を解説します。
sorted()関数のおさらい
Pythonの組み込み関数sorted()は、リストやタプル、辞書といったイテラブル(反復可能)オブジェクトをソートできる汎用的な関数です。sorted()は元のオブジェクトを変更せず、並べ替え済みの新しいオブジェクトを生成して返す点が特徴です。
sorted()の構文は次のとおりです。
sorted(object, key, reverse)
各引数の意味は以下の通りです。
- object: ソートしたいイテラブルオブジェクト(必須)
- key: カスタムなソート条件を指定するための関数(省略可)
- reverse: 降順でソートするかどうかを指定(省略可)
必須なのはobjectだけです。省略可能なkeyとreverseを指定しない場合、Pythonは自動的に昇順(小さい順)でソートを行います。
簡単な使用例
まず、基本的な動作を確認しましょう。カフェを経営していて、「コーヒークラブ」(ポイント会員)の顧客リストを五十音順ではなくアルファベット順に取得したい場面を想定します。顧客リストは登録日順に並んでいるため、これを名前順に並べ替えてみます。
customers = ['Kaley Fernandez', 'Darius Rowland', 'Isaac Borthwick', 'Alexandria Kidd'] sorted_customers = sorted(customers) print(sorted_customers)
このコードを実行すると、次の出力が得られます。
['Alexandria Kidd', 'Darius Rowland', 'Isaac Borthwick', 'Kaley Fernandez']
コードの流れを見てみましょう。最初の行で顧客名を格納したリストcustomersを定義し、次にsorted()を使って名前を昇順に並べ替えた新しいリストsorted_customersを作成しています。最後にprint()で結果をコンソールに出力しています。
辞書を値でソートする方法
辞書をキーと値のペアごとに並べ替えたい場合は、items()メソッドとsorted()関数を組み合わせます。
items()メソッドは、辞書内のすべてのキーと値のペアを取得できるメソッドです。このメソッドの結果に対してsorted()を適用し、さらにkey引数で「値」を基準にソートするよう指定することで、辞書を値順に並べ替えられます。以下に具体例を示します。
例1:降順でソートする
再びカフェの例に戻りましょう。コーヒーメニューの商品名と、先月の注文数を格納した辞書があるとします。「先月いちばん人気だったコーヒーは何か」を知りたいので、注文数の多い順(降順)に辞書を並べ替えます。
orders = {
'cappuccino': 54,
'latte': 56,
'espresso': 72,
'americano': 48,
'cortado': 41
}
sort_orders = sorted(orders.items(), key=lambda x: x[1], reverse=True)
for i in sort_orders:
print(i[0], i[1])
実行結果は次のとおりです。
espresso 72 latte 56 cappuccino 54 americano 48 cortado 41
このコードではいくつかの重要な要素が使われているので、順番に分解して見ていきましょう。
冒頭では、コーヒーの名前をキー、販売数を値として持つ辞書ordersを定義しています。
続いて、sorted()メソッドを使ってorders辞書を値の基準でソートしています。各引数の役割は次の表の通りです。
| 引数 | 指定内容 | 説明 |
| object | orders.items() | 「orders」辞書内のすべてのキーと値のペアを参照します。単に「orders」と指定した場合はインデックス位置から個々の値を取り出す必要がありますが、orders.items()を使うとキーと値のペアを含むイテラブルなリストが生成されるため扱いやすくなります。 |
| key | key=lambda x: x[1] | 辞書を値でソートするためのソート基準です。ここでは無名関数であるラムダ式を使用し、各タプルの2番目の要素(=値)を比較対象としています。 |
| reverse | reverse=True | データを降順で並べ替えることを指定しています。 |
最後に、forループでsort_orders内の各要素を順に取り出し、キー名と値を出力しています。出力される順序は、sorted()で指定したとおりの降順になります。
例2:昇順でソートする
逆に、カフェで最も売れなかったドリンクを調べたい場合は、先ほどのコードからreverse=Trueを外すだけでOKです。
orders = {
'cappuccino': 54,
'latte': 56,
'espresso': 72,
'americano': 48,
'cortado': 41
}
sort_orders = sorted(orders.items(), key=lambda x: x[1])
for i in sort_orders:
print(i[0], i[1])
実行すると、次の結果が返されます。
cortado 41 americano 48 cappuccino 54 latte 56 espresso 72
このように、先月の注文数をもとに、アイテムが少ない順(昇順)に並んだリストが出力されました。
リスト内包表記を使った簡潔な書き方
リスト内包表記を使っても、辞書の中身を値でソートできます。リスト内包表記とは、Pythonでリストを簡潔に生成するための記法で、複雑なソート処理を書く際にコード量を抑えられるメリットがあります。
先ほどのコーヒーの注文数を昇順にソートする処理を、リスト内包表記で書き直すと次のようになります。
orders = {
'cappuccino': 54,
'latte': 56,
'espresso': 72,
'americano': 48,
'cortado': 41
}
[print(key, value) for (key, value) in sorted(orders.items(), key=lambda x: x[1])]
実行結果は先ほどと同じです。
cortado 41 americano 48 cappuccino 54 latte 56 espresso 72
結果は前の例と同一ですが、コードの構造が異なります。先ほどはsort_orders変数を定義し、別途forループでソート済みリストを走査していました。一方この例では、リスト内包表記によってソート処理と出力処理を1行にまとめています。
このリスト内包表記は、辞書の各アイテムを昇順にソートしながら、それぞれのキーと値をコンソールに出力するという一連の処理を、コンパクトに実現しています。
まとめ
Pythonで辞書を扱うとき、値を基準に辞書をソートするのは非常によくある操作です。sorted()メソッドを使えば、目的に合わせて柔軟にデータを並べ替えられます。
この記事では、具体例を交えながら、key引数やreverse引数の使い方も含めて、sorted()で辞書を値順にソートする方法を解説しました。
これであなたも、Pythonのプロのように辞書を値でソートできるはずです!
-
Pythonで挿入ソート(Insertion Sort)を実装する方法:アルゴリズムとサンプルコードを徹底解説
この記事では、Python 3.x(およびそれ以前のバージョン)における挿入ソートの実装方法について詳しく解説します。挿入ソートは、トランプの手札を整理するイメージに近い、直感的で理解しやすいソートアルゴリズムです。挿入ソートのアルゴリズム挿入ソートは以下の手順で動作します。入力要素を順番に走査し、各反復ごとにソート済みの配列部分を少しずつ拡張していきます。現在注目している要素(キー)を、ソート済み部分の中で最も大きい値と比較します。キーがその値より大きければ、要素は元の位置のまま次の要素へ進みます。そうでなければ、ソート済み配列内の正しい位置を探し出し、そこへ移動させます。具体的には、ソート
-
Pythonで学ぶ挿入ソート(Insertion Sort)の仕組みと実装方法
この記事では、Python 3.xにおける挿入ソート(Insertion Sort)の基本的な考え方と、実際のコードによる実装方法をわかりやすく解説します。 挿入ソートのアルゴリズム 挿入ソートは、配列を「整列済みの部分」と「未整列の部分」に分け、未整列の要素を一つずつ取り出して、整列済み部分の正しい位置に挿入していくシンプルなソート手法です。処理の手順は以下の通りです。 1. 各反復ごとに整列済みの配列を少しずつ拡大しながら、入力要素を走査する。 2. 現在の要素(キー)を、整列済み配列内の最大値と比較する。 3. キーがその最大値より大きければ、要素はそのままの位置に置かれ、 次の要