このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。
【Python入門】ソートのキーにラムダ式を指定する

ソートのキーにラムダ式を指定する
ソートは、データ処理における基本的な操作のひとつです。Pythonでは、sorted関数やリストのsortメソッドを利用して、簡単にデータを並べ替えることができます。その際、「どの値を基準にしてソートするか」を指定するためのキー関数として、ラムダ式を使う方法が非常に便利です。ラムダ式を使えば、関数を別途定義する手間を省き、インラインでソート基準を記述できるため、コードがシンプルになります。以下では、ソートの基本、ソートのキーとしてラムダ式を指定する方法、そして具体的な例を通してその効果を解説します。

プログラムのダウンロード
「ダウンロード」から、JupyterLab で実行できるサンプルプログラムがダウンロードできます。ファイルは、ESET Endpoint Securityでウイルスチェックをしておりますが、ダウンロードとプログラムの実行は自己責任でお願いいたします。
1.ソートの基本とキーの指定
1.1. sorted関数とsortメソッド
Pythonでは、以下の2種類の方法でソートを実現できます。
- sorted関数:任意のイテラブルをソートして、新しいリストを返します。
sorted(イテラブル, key=関数, reverse=ブール値)
- sortメソッド:リスト専用のメソッドで、リスト自体を並べ替えます。
リスト.sort(key=関数, reverse=ブール値)
1.2. ソートのキー(key)とは
ソートの際に、どの値を基準に並べ替えるかを指定するのがキーです。キーは、各要素を引数に取り、その戻り値を元にソート順を決定します。たとえば、辞書やタプルの場合、既定では先頭の要素が比較されますが、key引数にラムダ式を渡すことで、任意の値を基準にソートすることができます。
以下の表は、キー指定に使える方法をまとめたものです。
項目 | 説明 |
---|---|
既定の比較 | 要素同士が自然な順序(例えば辞書では最初の値)で比較される。 |
key引数 | 関数を指定して、各要素からソート基準となる値を抽出する。 |
reverse引数 | Trueを指定すると降順、False(デフォルト)なら昇順にソートする。 |
2.ラムダ式をキーに指定したソートの実践例
2.1. 例:書籍情報のソート
ここでは、書籍の情報を格納したリストを例に、ラムダ式を使ってソートする方法を解説します。各書籍は辞書として表現され、"title"(タイトル)、"price"(価格)、"pages"(ページ数)というキーを持ちます。
まずは、書籍情報のリストを作成します。
# 書籍情報のリスト(各書籍は辞書で表現)
books = [
{"title": "Python入門", "price": 3000, "pages": 250},
{"title": "データサイエンスの基礎", "price": 4500, "pages": 350},
{"title": "アルゴリズムとデータ構造", "price": 4000, "pages": 300}
]
# 価格の昇順でソートする(ラムダ式をキーに指定)
sorted_by_price = sorted(books, key=lambda book: book["price"])
print("Sorted by price (ascending):")
for book in sorted_by_price:
print(book)
実行結果
Sorted by price (ascending):
{'title': 'Python入門', 'price': 3000, 'pages': 250}
{'title': 'アルゴリズムとデータ構造', 'price': 4000, 'pages': 300}
{'title': 'データサイエンスの基礎', 'price': 4500, 'pages': 350}
解説
sorted
関数のkey引数にlambda book: book["price"]
を指定することで、各書籍の"price"値を抽出し、その数値を基準にソートします。- 結果は、価格が低い順に書籍情報が表示されます。
2.2. 応用:価格あたりのページ数が高い順にソートする
次に、各書籍の「価格あたりのページ数」(ページ数/価格)を計算し、これを基準に降順にソートしてみます。
# 価格あたりのページ数が高い順にソートする
sorted_by_efficiency = sorted(books, key=lambda book: book["pages"] / book["price"], reverse=True)
print("\nSorted by pages per price (descending):")
for book in sorted_by_efficiency:
print(book)
実行結果
Sorted by pages per price (descending):
{'title': 'Python入門', 'price': 3000, 'pages': 250}
{'title': 'データサイエンスの基礎', 'price': 4500, 'pages': 350}
{'title': 'アルゴリズムとデータ構造', 'price': 4000, 'pages': 300}
解説
- ラムダ式
lambda book: book["pages"] / book["price"]
は、各書籍のページ数を価格で割った値を返します。 reverse=True
を指定することで、この値が高い順(つまり、コストパフォーマンスが高い順)に書籍情報が並べ替えられます。- 結果として、より効率的な書籍(価格あたりに多くのページがある書籍)が先頭に表示されます。
まとめ
ソートのキーにラムダ式を指定することで、デフォルトの比較方法では実現しにくい複雑なソート基準を簡潔に定義できます。
- sorted関数やsortメソッドのkey引数にラムダ式を渡すことで、各要素から任意の値を抽出し、その値に基づいて並べ替えることができます。
- 逆順ソートにはreverse引数を利用し、さらに複数の基準を組み合わせる場合もラムダ式を使うことで、コードが非常に短くなります。
これらのテクニックを活用することで、データの並べ替え処理がより柔軟に、かつ効率的に実装できるようになります。