概要
Pythonのsorted()関数は、リストやその他のイテラブルを昇順または降順にソートするための便利なビルトイン関数です。さらに、ソートの基準をカスタマイズすることで、複雑なルールに基づいたカスタムソートも簡単に実装できます。本記事では、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には各要素に適用される関数を渡すことができ、その結果に基づいてソートが行われます。
例えば、リスト内の文字列をその長さでソートする場合は、keyにlen(文字列の長さを返す関数)を渡します。
文字列の長さでソートする例
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.ageをkeyに渡すことで、Personオブジェクトのage属性に基づいてソートが行われています。
ソートの安定性
Pythonのsorted()関数は「安定なソート」です。これは、同じ値を持つ要素の相対的な順序が保持されることを意味します。例えば、同じ年齢の人がいた場合でも、リスト内の元の順序がソート後も維持されます。
安定なソートの例
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)]
このように、AliceとCharlieは同じ年齢ですが、元のリストにおける順序(Aliceが先)が保持されています。
結論
Pythonのsorted()関数は、簡単にリストや他のイテラブルをソートするための強力なツールです。デフォルトの昇順ソートからカスタムソートまで、幅広い用途に対応しています。特に、keyパラメータを使ったカスタムソートは、柔軟なソート処理を実現し、複雑なデータ構造
でも簡単にソートが可能です。データ処理やオブジェクト管理を行う際には、sorted()を活用して効率的にデータを整理しましょう。