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 らしいコードを書くことができるようになります。