概要

Pythonsorted()関数は、リストやその他のイテラブルを昇順または降順にソートするための便利なビルトイン関数です。さらに、ソートの基準をカスタマイズすることで、複雑なルールに基づいたカスタムソートも簡単に実装できます。本記事では、sorted()関数の基本的な使い方から、カスタムソートの方法までをわかりやすく解説します。

sorted() 関数の基本的な使い方

sorted()関数は、リストやタプルなどのイテラブル(繰り返し可能なオブジェクト)をソートし、新しいリストとして結果を返します。元のオブジェクトは変更されません。sorted()はデフォルトで昇順にソートを行いますが、reverseパラメータを使用することで降順にソートすることも可能です。

基本的な例

numbers = [5, 2, 9, 1, 5, 6]
sorted_numbers = sorted(numbers)
print(sorted_numbers)  # 出力: [1, 2, 5, 5, 6, 9]

元のリストnumbersは変更されず、新しいソートされたリストsorted_numbersが生成されます。

reverse パラメータ

reverse=Trueを指定すると、昇順ではなく降順にソートされます。

sorted_numbers_desc = sorted(numbers, reverse=True)
print(sorted_numbers_desc)  # 出力: [9, 6, 5, 5, 2, 1]

カスタムソート - key パラメータを使う

sorted()関数の最大の特徴の一つは、keyパラメータを使ってカスタムソートができる点です。keyには各要素に適用される関数を渡すことができ、その結果に基づいてソートが行われます。 例えば、リスト内の文字列をその長さでソートする場合は、keylen(文字列の長さを返す関数)を渡します。

文字列の長さでソートする例

words = ["apple", "banana", "cherry", "date"]
sorted_by_length = sorted(words, key=len)
print(sorted_by_length)  # 出力: ['date', 'apple', 'banana', 'cherry']

この例では、key=lenとすることで、文字列の長さに基づいてソートが行われています。

カスタム関数を使ったソート

カスタムソートでは、単に組み込み関数を使うだけでなく、独自のルールを実装した関数をkeyに渡すことが可能です。例えば、数値の絶対値でソートする場合や、文字列を特定の順番に並べる場合など、柔軟なソートを行えます。

カスタムソートの例 - 絶対値でソート

数値のリストを絶対値でソートする例を見てみましょう。

numbers = [-6, -2, 4, 1, -5, 3]
sorted_by_abs = sorted(numbers, key=abs)
print(sorted_by_abs)  # 出力: [1, -2, 3, 4, -5, -6]

key=absを指定することで、絶対値を基準にソートが行われています。

複雑なカスタム関数を使った例

さらに複雑なカスタム関数を使ったソートも可能です。たとえば、複数の条件を組み合わせたカスタムソートを行うこともできます。次に、リスト内のタプルを、第1要素で昇順に、第2要素で降順にソートする例を見てみましょう。

tuples = [(1, 3), (3, 2), (2, 4), (2, 1)]
sorted_tuples = sorted(tuples, key=lambda x: (x[0], -x[1]))
print(sorted_tuples)  # 出力: [(1, 3), (2, 4), (2, 1), (3, 2)]

この例では、lambdaを使ってタプルの第1要素を基準に昇順ソートし、第2要素はマイナス符号を付けることで降順にソートしています。

カスタムオブジェクトのソート

sorted()はリストやタプルだけでなく、カスタムオブジェクトもソート可能です。カスタムオブジェクトの場合、keyにオブジェクトの属性を基準とする関数を渡します。次の例では、Personクラスのインスタンスを年齢でソートしています。

クラスオブジェクトのソート例

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def __repr__(self):
        return f"{self.name} ({self.age})"
people = [Person("Alice", 30), Person("Bob", 25), Person("Charlie", 35)]
# 年齢でソート
sorted_people = sorted(people, key=lambda person: person.age)
print(sorted_people)  # 出力: [Bob (25), Alice (30), Charlie (35)]

この例では、lambda person: person.agekeyに渡すことで、Personオブジェクトのage属性に基づいてソートが行われています。

ソートの安定性

Pythonsorted()関数は「安定なソート」です。これは、同じ値を持つ要素の相対的な順序が保持されることを意味します。例えば、同じ年齢の人がいた場合でも、リスト内の元の順序がソート後も維持されます。

安定なソートの例

people = [Person("Alice", 30), Person("Bob", 25), Person("Charlie", 30)]
# 年齢でソート(同じ年齢の場合は元の順序が保持される)
sorted_people = sorted(people, key=lambda person: person.age)
print(sorted_people)  # 出力: [Bob (25), Alice (30), Charlie (30)]

このように、AliceCharlieは同じ年齢ですが、元のリストにおける順序(Aliceが先)が保持されています。

結論

Pythonsorted()関数は、簡単にリストや他のイテラブルをソートするための強力なツールです。デフォルトの昇順ソートからカスタムソートまで、幅広い用途に対応しています。特に、keyパラメータを使ったカスタムソートは、柔軟なソート処理を実現し、複雑なデータ構造 でも簡単にソートが可能です。データ処理やオブジェクト管理を行う際には、sorted()を活用して効率的にデータを整理しましょう。