Pythonのsorted関数とは
Python
のsorted関数は、リストやタプルなどのイテラブル(反復可能なオブジェクト)を昇順や降順に並べ替えるための組み込み関数です。リストのsort()
メソッドとは異なり、元のオブジェクトを変更せず、新しいソート済みのリストを返す点が特徴です。sorted関数は、数値、文字列、タプル、辞書など幅広いデータ型に対応しており、柔軟なデータ操作が可能です。
sorted関数の基本構文
sorted(iterable, key=None, reverse=False)
- iterable
ソートする対象のイテラブルなオブジェクト(リスト、タプル、文字列など)。 - key(省略可能)
ソート基準を指定する関数を指定できます。デフォルトでは要素自体を基準にソートします。 - reverse(省略可能)
True
に設定すると、降順にソートします。デフォルトはFalse
(昇順)。
基本的な使い方
リストのソート
sorted関数の最も基本的な使い方は、リストを昇順にソートすることです。
numbers = [5, 2, 9, 1, 5, 6]
sorted_numbers = sorted(numbers)
print(sorted_numbers) # 結果: [1, 2, 5, 5, 6, 9]
元のnumbers
リストは変更されず、新しいソート済みのリストが返されます。
文字列のソート
文字列もイテラブルなオブジェクトであるため、sorted関数を使って文字ごとに並べ替えることができます。
text = "python"
sorted_text = sorted(text)
print(sorted_text) # 結果: ['h', 'n', 'o', 'p', 't', 'y']
文字列をリストとして扱い、各文字をアルファベット順にソートしています。
タプルのソート
タプルもsorted関数でソート可能です。ただし、ソートの結果はリストとして返されます。
numbers_tuple = (3, 1, 4, 1, 5, 9)
sorted_tuple = sorted(numbers_tuple)
print(sorted_tuple) # 結果: [1, 1, 3, 4, 5, 9]
タプルをそのままソートしたい場合は、結果を再度タプルに変換する必要があります。
sorted_tuple = tuple(sorted(numbers_tuple))
print(sorted_tuple) # 結果: (1, 1, 3, 4, 5, 9)
reverse引数で降順ソート
reverse
引数をTrue
に設定することで、降順(大きい順)にソートできます。
numbers = [5, 2, 9, 1, 5, 6]
sorted_numbers_desc = sorted(numbers, reverse=True)
print(sorted_numbers_desc) # 結果: [9, 6, 5, 5, 2, 1]
この例では、リストが大きい順に並べ替えられています。
key引数を使ったカスタムソート
sorted関数は、key
引数を使うことで、カスタムのソート基準を指定することができます。keyには、ソート基準を決める関数やラムダ式を指定します。
長さで文字列をソート
文字列の長さに基づいてリストをソートする例です。
words = ["apple", "banana", "cherry", "date"]
sorted_by_length = sorted(words, key=len)
print(sorted_by_length) # 結果: ['date', 'apple', 'banana', 'cherry']
この例では、len
関数をkeyとして指定し、文字列の長さに基づいてソートしています。
辞書の値でソート
辞書のリストを特定のキーの値に基づいてソートする例です。例えば、辞書リストでage
に基づいてソートします。
people = [
{"name": "John", "age": 25},
{"name": "Alice", "age": 30},
{"name": "Bob", "age": 20}
]
sorted_by_age = sorted(people, key=lambda person: person["age"])
print(sorted_by_age)
# 結果: [{'name': 'Bob', 'age': 20}, {'name': 'John', 'age': 25}, {'name': 'Alice', 'age': 30}]
このように、lambda
関数を使って特定の辞書キーに基づいたソートも簡単に実現できます。
複数条件でのソート
sorted関数を使うと、複数の条件に基づいたソートも可能です。たとえば、まずage
でソートし、その後にname
でソートするような処理も簡単に実装できます。
people = [
{"name": "John", "age": 25},
{"name": "Alice", "age": 30},
{"name": "John", "age": 20},
{"name": "Bob", "age": 20}
]
sorted_by_age_then_name = sorted(people, key=lambda person: (person["age"], person["name"]))
print(sorted_by_age_then_name)
# 結果:
# [{'name': 'Bob', 'age': 20}, {'name': 'John', 'age': 20}, {'name': 'John', 'age': 25}, {'name': 'Alice', 'age': 30}]
この例では、まず年齢でソートし、次に名前のアルファベット順でソートしています。
文字列を数値としてソート
文字列として数値が格納されたリストを、数値順にソートしたい場合は、int
関数をkeyとして使用します。
num_strings = ["10", "1", "20", "3"]
sorted_num_strings = sorted(num_strings, key=int)
print(sorted_num_strings) # 結果: ['1', '3', '10', '20']
この例では、文字列を数値に変換した上でソートしているため、数値順に正しく並べ替えられます。
sorted関数の応用例
ファイルの行をソート
テキストファイルの内容をソートする場合、sorted関数を使って各行を並べ替えることができます。
with open("sample.txt", "r") as file:
lines = file.readlines()
sorted_lines = sorted(lines)
print(sorted_lines)
このように、テキストデータを読み込んで行ごとにソートし、出力することが可能です。
カスタムオブジェクトのソート
独自に定義したクラスのインスタンスを、特定の属性に基づ いてソートすることもできます。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
people = [Person("John", 25), Person("Alice", 30), Person("Bob", 20)]
sorted_people = sorted(people, key=lambda person: person.age)
for person in sorted_people:
print(person.name, person.age)
# 結果:
# Bob 20
# John 25
# Alice 30
この例では、Person
クラスのage
属性に基づいて、インスタンスのリストがソートされています。
結論
Python
のsorted関数は、シンプルなソートからカスタムソートまで、幅広いソート操作を簡単に実現できる非常に便利な組み込み関数です。元のデータを変更せずにソートした結果を取得できるため、安全で効率的なソート操作が可能です。reverseフラグやkey引数を使って、さらに柔軟なソートができるので、データ処理や分析の際に役立ちます。ぜひ、様々なデータ型に対してsorted関数を活用してみてください。