概要
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()
を活用して効率的にデータを整理しましょう。