HOWTO · Python
Python のラムダによるソート
Python の sorted()と.sort()を使ったリストのソート方法を学びましょう。key パラメータ、lambda 関数、文字列・タプル・辞書・オブジェクトの実用的なソート例を紹介。効率的なソート技術をマスターし、パフォーマンスを向上させましょう!
このページの内容
以下は、指定された記事を日本語に翻訳し、同じフォーマットを保持したバージョンです。内部リンクがある場合、.en.md を .ja.md に置き換えています。
ソートは Python における基本的な操作であり、データを効率的に整理するために不可欠です。Python は、リストをソートするための 2つの組み込み関数を提供しています: sorted() と sort() です。これらの関数は、昇順または降順でのソートを可能にし、key パラメータを使用してカスタムソートロジックをサポートします。
このガイドでは、sorted() と sort() の違いを探り、カスタムソートのために key パラメータを使用する方法をデモンストレーションし、lambda 関数を使用した実用的な例を示します。
sorted() と sort() の違いを理解する
lambda 関数を使用したソートに飛び込む前に、sorted() と sort() がどのように異なるかを理解することが重要です。
| 関数 | 対象 | 戻り値 | インプレースソート? | 使用例 |
|---|---|---|---|---|
sorted() |
任意の反復可能オブジェクト(リスト、タプル、文字列、辞書など) | 新しいソート済みリスト | ❌ いいえ | sorted(lst) |
.sort() |
リストのみ | 元のリストを変更 | ✅ はい | lst.sort() |
例: sorted() と .sort() の違い
# sorted()を使用(新しいリストを返す)
numbers = [5, 3, 8, 1]
new_sorted_list = sorted(numbers)
print(new_sorted_list) # [1, 3, 5, 8]
print(numbers) # [5, 3, 8, 1] (変更なし)
# sort()を使用(元のリストを変更する)
numbers.sort()
print(numbers) # [1, 3, 5, 8] (元のリストが変更される)
各メソッドを使用するタイミング
sorted()を使用する場合: 元のリストを変更せずにソート済みのコピーが必要な場合。.sort()を使用する場合: メモリを節約するためにインプレースでソートすることが望ましい場合。
key パラメータを使用したソート
key パラメータを使用すると、カスタムソートロジックを定義できます。デフォルトの順序(例: アルファベット順や数値順)に基づいてソートする代わりに、ソート前に特定の値を抽出できます。
例: 単語の長さでソートする
words = ["banana", "apple", "cherry", "blueberry"]
sorted_words = sorted(words, key=len)
print(sorted_words)
出力:
['apple', 'banana', 'cherry', 'blueberry']
**なぜ?**これは単語を長さでソートし、アルファベット順ではありません。
カスタムソートのための lambda 関数の使用
lambda 関数は、インラインでカスタムソートロジックを定義する簡潔な方法を提供します。さまざまなユースケースを探ってみましょう。
1. 数値部分を含む文字列のソート
lst = ["id01", "id10", "id02", "id12", "id03", "id13"]
lst_sorted = sorted(lst, key=lambda x: int(x[2:]))
print(lst_sorted)
出力:
['id01', 'id02', 'id03', 'id10', 'id12', 'id13']
説明: これは最初の 2 文字(id)を無視し、数値に基づいてソートします。
2. タプルのリストを特定の要素でソートする
lst = [("Mark", 1), ("Jack", 5), ("Jake", 7), ("Sam", 3)]
lst_sorted = sorted(lst, key=lambda x: x[1])
print(lst_sorted)
出力:
[('Mark', 1), ('Sam', 3), ('Jack', 5), ('Jake', 7)]
説明: これは各タプルの2 番目の要素(数値)でソートします。
3. 降順でソートする
reverse=True 引数を使用して降順でソートします。
students = [("Alice", 85), ("Bob", 78), ("Charlie", 92)]
sorted_students = sorted(students, key=lambda x: x[1], reverse=True)
print(sorted_students)
出力:
[('Charlie', 92), ('Alice', 85), ('Bob', 78)]
なぜ?これは学生をスコアで降順にソートします。
4. 辞書を値でソートする
scores = {"Alice": 85, "Bob": 78, "Charlie": 92}
sorted_scores = sorted(scores.items(), key=lambda x: x[1])
print(sorted_scores)
出力:
[('Bob', 78), ('Alice', 85), ('Charlie', 92)]
なぜ?辞書を値でソートすることは一般的なユースケースです。
5. 姓でソートする(split() を使用)
names = ["John Doe", "Jane Smith", "Alice Brown"]
sorted_names = sorted(names, key=lambda name: name.split()[-1])
print(sorted_names)
出力:
['Alice Brown', 'John Doe', 'Jane Smith']
なぜ?フルネームのリストを姓でソートすることは、従業員リスト、連絡先アプリ、データベースで役立ちます。
6. オブジェクトのリストをソートする
class Product:
def __init__(self, name, price):
self.name = name
self.price = price
products = [Product("Laptop", 1200), Product("Phone", 800), Product("Tablet", 600)]
sorted_products = sorted(products, key=lambda p: p.price)
for p in sorted_products:
print(p.name, p.price)
出力:
Tablet 600
Phone 800
Laptop 1200
なぜ?オブジェクトをソートすることは、e コマースや在庫管理などの実世界のアプリケーションで不可欠です。
比較表: 各ソート方法を使用するタイミング
| ソート方法 | 最適なユースケース |
|---|---|
sorted() |
元のリストを変更せずに新しいソート済みリストが必要な場合 |
.sort() |
メモリ効率のためにリストをインプレースでソートする場合 |
key=lambda |
カスタムソート(例: タプルの 2 番目の要素でソート) |
reverse=True |
降順でソートする場合 |
| オブジェクトのソート | カスタムクラスやデータモデルを扱う場合 |
結論
リストを効率的にソートすることは、Python における重要なスキルです。sorted() と .sort() の違いを探り、カスタムソートのために key パラメータを使用する方法を学び、lambda 関数を使用した実世界の例をデモンストレーションしました。
これらのテクニックをマスターすることで、複雑なソートタスクを効果的に処理し、より最適化され、読みやすく、Python らしいコードを書くことができるようになります。