Pythonのsorted()関数を徹底解説! リストや様々なデータを柔軟にソートする方法
Pythonプログラミングにおいて、データを特定の順序に並べ替えたい場面は非常に頻繁に訪れます。数値の昇順、文字列の降順、あるいは複雑なオブジェクトを特定の属性で並べ替えたいなど、その要求は多岐にわたります。そんな時に大活躍するのが、Pythonの組み込み関数**sorted()**です。
この記事では、sorted()関数の基本的な使い方から、様々なデータ型での適用例、そして柔軟なソートを実現するための高度なオプションまで、初心者の方にも分かりやすく徹底的に解説します。sorted()をマスターすれば、あなたのPythonコードはもっと効率的で、データ処理の幅が格段に広がるでしょう!
sorted()関数とは? なぜ使うのか?
sorted()関数は、あらゆるイテラブルなオブジェクトの要素を新しいソート済みリストとして返すための、Pythonの組み込み関数です。組み込み関数なので、import文を使って何かを読み込む必要はありません。すぐに使うことができます。
なぜsorted()を使うのでしょうか?
-
元のデータを変更しない(非破壊的):
list.sort()メソッドのように元のリストを直接変更するのではなく、常に新しいソート済みのリストを返すため、元のデータの状態を保ちたい場合に最適です。 -
汎用性: リストだけでなく、タプル、セット、辞書(キーをソート)、文字列など、あらゆるイテラブルなオブジェクトをソートできます。
-
柔軟なソート: ソート順(昇順/降順)や、ソートの基準となるキーを細かく指定できるため、複雑な要件にも対応できます。
sorted()関数の基本的な使い方
sorted()関数の使い方は非常にシンプルです。必須引数は一つ、ソートしたいイテラブルなオブジェクトを渡すだけです。
構文
sorted(iterable, *, key=None, reverse=False)
引数
-
iterable(必須): ソートしたい要素を含むイテラブルなオブジェクト(リスト、タプル、セット、文字列、辞書など)。 -
key(オプション): 各要素をソートする前に適用される、1つの引数を受け取る関数。この関数の戻り値がソートの基準となります(後述の「カスタマイズソート」で詳述)。デフォルトはNoneで、要素自体が比較されます。 -
reverse(オプション): ブール値。Trueに設定すると降順にソートされます。デフォルトはFalse(昇順)。
戻り値
指定されたイテラブルの要素をソートした新しいリスト。
具体例:数値のソート
numbers = [3, 1, 4, 1, 5, 9, 2]
# 昇順ソート (デフォルト)
sorted_asc = sorted(numbers)
print(f"昇順: {sorted_asc}") # 出力: 昇順: [1, 1, 2, 3, 4, 5, 9]
# 降順ソート
sorted_desc = sorted(numbers, reverse=True)
print(f"降順: {sorted_desc}") # 出力: 降順: [9, 5, 4, 3, 2, 1, 1]
print(f"元のリスト: {numbers}") # 出力: 元のリスト: [3, 1, 4, 1, 5, 9, 2] (元のリストは変更されない)
様々なデータ型でのsorted()の使い方
sorted()関数は、Pythonの多くのイテラブル型に対して使用できます。
1. 文字列 (str)
文字列は文字のシーケンスとして扱われ、文字コード順にソートされます。
my_string = "python"
print(sorted(my_string)) # 出力: ['h', 'n', 'o', 'p', 't', 'y']
print("".join(sorted(my_string))) # 文字列として結合: 'hnopty'
2. タプル (tuple)
タプルの要素もソートされ、結果はリストとして返されます。
my_tuple = (30, 10, 40, 20)
print(sorted(my_tuple)) # 出力: [10, 20, 30, 40]
3. セット (set)
セットの要素は順序を持たないため、ソートすると必ず新しい順序付けられたリストになります。
my_set = {5, 1, 3, 2, 4}
print(sorted(my_set)) # 出力: [1, 2, 3, 4, 5]
4. 辞書 (dict)
辞書をsorted()に渡すと、そのキーがソートされてリストとして返されます。
my_dict = {"apple": 3, "orange": 1, "banana": 2}
print(sorted(my_dict)) # 出力: ['apple', 'banana', 'orange'] (キーがソートされる)
key引数を使ったカスタマイズソート
sorted()関数の最も強力な機能の一つがkey引数です。これにより、要素自体ではなく、要素の特定の部分や、要素に何らかの処理を施した結果に基づいてソートできます。
keyには、ソート対象の各要素を引数として受け取り、ソートの比較に使用する値を返す「関数」を指定します。通常はlambda式がよく使われます。
1. 文字列の長さを基準にソート
words = ["apple", "banana", "kiwi", "grape"]
# 文字列の長さを基準にソート
sorted_by_length = sorted(words, key=len)
print(f"長さでソート: {sorted_by_length}") # 出力: 長さでソート: ['kiwi', 'apple', 'grape', 'banana']
2. オブジェクトの特定の属性でソート
クラスのインスタンスを持つリストを、特定の属性でソートしたい場合に便利です。
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", 30), Person("Bob", 25), Person("Charlie", 35)]
# 年齢を基準にソート
sorted_by_age = sorted(people, key=lambda p: p.age)
print(f"年齢でソート: {sorted_by_age}")
# 出力: 年齢でソート: [Person('Bob', 25), Person('Alice', 30), Person('Charlie', 35)]
# 名前を基準に降順ソート
sorted_by_name_desc = sorted(people, key=lambda p: p.name, reverse=True)
print(f"名前(降順)でソート: {sorted_by_name_desc}")
# 出力: 名前(降順)でソート: [Person('Charlie', 35), Person('Bob', 25), Person('Alice', 30)]
lambda関数 lambda p: p.age は、「Personオブジェクト p を受け取ったら、そのage属性の値を返して、その値でソートの比較をしてね」という意味になります。
sorted()とlist.sort()の違い
Pythonでデータをソートする方法としては、sorted()関数の他にリストのsort()メソッドがあります。この二つには重要な違いがあります。
| 特徴 | sorted()関数 |
list.sort()メソッド |
| 対象 | あらゆるイテラブル | リストオブジェクトのみ |
| 戻り値 | 新しいソート済みリスト | None(元のリストを直接変更する) |
| 元のデータ | 変更しない(非破壊的) | 直接変更する(破壊的) |
| メモリ | 新しいリストを作成するため、元のデータのコピー分のメモリを消費する | その場で変更するため、基本的にはメモリ消費が少ない |
# sorted() の例
data1 = [3, 1, 2]
result1 = sorted(data1)
print(f"sorted()の結果: {result1}") # [1, 2, 3]
print(f"元のデータ1: {data1}") # [3, 1, 2] (変更されない)
# list.sort() の例
data2 = [3, 1, 2]
data2.sort() # 戻り値はNone
print(f"sort()後のデータ2: {data2}") # [1, 2, 3] (元のデータが変更される)
使い分けのポイント:
-
元のデータを変更したくない、またはリスト以外のイテラブルをソートしたい場合は
sorted()。 -
リストの内容をその場でソートしたい(破壊的ソートで構わない)場合は
list.sort()。
まとめ
sorted()関数は、Pythonでデータを柔軟かつ効率的にソートするための、非常に強力な組み込み関数です。
-
あらゆるイテラブルなオブジェクトの要素をソートし、新しいソート済みリストを返す(非破壊的)。
-
key引数を使うことで、ソートの基準を自由にカスタマイズできる。 -
reverse=Trueで降順ソートが可能。 -
リストの
sort()メソッドとの違い(非破壊的か破壊的か、対象のデータ型)を理解して適切に使い分けることが重要。
sorted()関数を使いこなすことで、Pythonでのデータ処理が格段にスムーズになり、より高度なロジックを簡潔に記述できるようになるでしょう。ぜひ今日学んだことを、あなたのコーディングに活かしてみてくださいね!
■プロンプトだけでオリジナルアプリを開発・公開してみた!!
■AI時代の第一歩!「AI駆動開発コース」はじめました!
テックジム東京本校で先行開始。
■テックジム東京本校
「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。
<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。
<月1開催>放送作家による映像ディレクター養成講座
<オンライン無料>ゼロから始めるPython爆速講座

