今回は、Pythonのsorted関数でソートキーを指定する方法についてご紹介します。
sorted関数とは
Pythonのsorted関数は、リストなどのイテラブル(繰り返し可能)なデータをソート(並び替え)して新しいリストとして返す関数です。
元のリストやタプルなどのデータはそのまま保持され、ソートされた結果のみを新しいオブジェクトとして受け取ることができます。
例えば、単純に数値リストを昇順にソートする際は以下のように記述します。
1 2 3 |
numbers = [3, 1, 4, 2] sorted_numbers = sorted(numbers) print(sorted_numbers) |
このように、sorted関数は非常に便利で柔軟性が高い関数です。
さらに、key引数を用いると、特定の基準を指定してソートを行うことができます。
key引数の基本的な使い方
key引数には、ソートの際に各要素から比較対象となる値を取り出すための関数を指定します。
要素に対してこの関数が呼び出され、その戻り値に基づいて並び替えが行われます。
具体的には、以下のような流れで処理されます。
- ソート対象のリストなどの各要素に対して、keyで指定した関数が一度だけ呼び出される
- その戻り値をもとに要素同士が比較される
- 最終的にソートされた結果が返される
文字列のリストを大文字・小文字を区別せずにソートする例
以下の例では、str.lowerをkeyに設定し、全て小文字として比較することで、大文字・小文字の違いを無視して並べ替えています。
1 2 3 |
words = ['apple', 'Banana', 'cherry'] sorted_words = sorted(words, key=str.lower) print(sorted_words) |
[‘apple’, ‘Banana’, ‘cherry’]
タプルのリストを特定の要素でソートする例
次の例では、タプルのインデックス1にある数値をソート基準としています。
1 2 3 |
data = [('Alice', 25), ('Bob', 20), ('Charlie', 30)] sorted_data = sorted(data, key=lambda x: x[1]) print(sorted_data) |
[(‘Bob’, 20), (‘Alice’, 25), (‘Charlie’, 30)]
辞書のリストを特定のキー値でソートする例
辞書のリストの場合は、辞書内のキーを指定してその値を取り出すようにします。
1 2 3 4 5 6 7 |
people = [ {'name': 'Alice', 'age': 25}, {'name': 'Bob', 'age': 20}, {'name': 'Charlie', 'age': 30} ] sorted_people = sorted(people, key=lambda person: person['age']) print(sorted_people) |
[{‘name’: ‘Bob’, ‘age’: 20}, {‘name’: ‘Alice’, ‘age’: 25}, {‘name’: ‘Charlie’, ‘age’: 30}]
カスタムクラスのオブジェクトを属性でソートする例
独自に定義したクラスでも、特定の属性をソート基準とできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class Person: def __init__(self, name, age): self.name = name self.age = age def __repr__(self): return f'Person({self.name}, {self.age})' people = [ Person('Alice', 25), Person('Bob', 20), Person('Charlie', 30) ] sorted_people = sorted(people, key=lambda person: person.age) print(sorted_people) |
[Person(Bob, 20), Person(Alice, 25), Person(Charlie, 30)]
注意点とよくあるエラー
ここでは、key引数を使う際に気を付けたいポイントや、よくあるエラー事例をご紹介します。
まず、sorted関数は安定ソートです。
keyによる比較結果が同じ場合、もとの順序が維持される点が特徴です。
次に、keyで返す値の型が混在すると、ソート時にTypeErrorが発生する可能性があります。
例えば、文字列と数値を混在させてソートしようとすると、比較ができずにエラーが起こることがあります。
また、key関数で計算量の大きい処理を行うと、要素数が増えるほどソートに時間がかかります。
必要に応じて、キャッシュや事前計算などの工夫を検討するとパフォーマンスを向上できます。
まとめ
sorted関数にkey引数を指定することで、データをより柔軟にソートできます。
リストや辞書、カスタムクラスなど、あらゆる場面で活用することが可能です。
エラーを防ぐには、混在する型に注意し、必要に応じて適切な変換や条件分岐を行うと良いでしょう。