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関数を活用してみてください。