こんにちは、かつコーチです。
Pythonでリストを並び替えようとすると、必ず出てくるのがsorted()とsort()です。
「名前が似ているけど、何が違うの?」
「どっちを使えばいいのか毎回迷う」
そんな悩みを持つ初心者の方は多いと思います。
この記事では、sorted()とsort()の違いを整理しながら、key引数・reverse引数の使い方まで解説します。
読み終える頃には、場面に応じて正しく使い分けられるようになります。
sorted()とsort()の基本の書き方
sorted()は新しいリストを返す
sorted()は、元のリストを変更せずに、並び替えた新しいリストを作って返す関数です。
組み込み関数なので、リストだけでなくタプルや文字列にも使えます。
numbers = [5, 2, 8, 1, 9]
sorted_numbers = sorted(numbers)
print(sorted_numbers)
print(numbers)
実行結果は次の通りです。
[1, 2, 5, 8, 9]
[5, 2, 8, 1, 9]
sorted_numbersは並び替えられていますが、元のnumbersは変わっていません。
sort()は元のリストを直接並び替える
sort()は、リストが持つメソッドで、元のリストの中身を直接書き換えます。
このように元のデータ自体を変更する処理を破壊的メソッドと呼びます。
numbers = [5, 2, 8, 1, 9]
result = numbers.sort()
print(numbers)
print(result)
実行結果は次の通りです。
[1, 2, 5, 8, 9]
None
ここで注目してほしいのが、resultがNoneになっている点です。
sort()は新しいリストを返すのではなく、元のリストを書き換えるだけの処理なので、戻り値は常にNoneになります。
key引数で並び替えの基準を指定する
key引数を使うと、独自の基準で並び替えができます。
たとえば、文字列の長さを基準に並び替えたい場合は、次のように書きます。
words = ["banana", "fig", "apple", "kiwi"]
sorted_words = sorted(words, key=len)
print(sorted_words)
実行結果は次の通りです。
['fig', 'kiwi', 'apple', 'banana']
辞書のリストを特定のキーで並び替えたいときも、key引数にlambdaを渡すことでよく使います。
users = [
{"name": "田中", "age": 28},
{"name": "佐藤", "age": 22},
{"name": "鈴木", "age": 35},
]
sorted_users = sorted(users, key=lambda user: user["age"])
print(sorted_users)
実行結果は次の通りです。
[{'name': '佐藤', 'age': 22}, {'name': '田中', 'age': 28}, {'name': '鈴木', 'age': 35}]
reverse引数で降順に並び替える
デフォルトでは昇順(小さい順)に並びますが、reverse=Trueを指定すると降順(大きい順)になります。
numbers = [5, 2, 8, 1, 9]
desc_numbers = sorted(numbers, reverse=True)
print(desc_numbers)
実行結果は次の通りです。
[9, 8, 5, 2, 1]
keyとreverseは同時に指定できるので、「年齢が高い順に並べたい」といった要望も一行で書けます。
users = [
{"name": "田中", "age": 28},
{"name": "佐藤", "age": 22},
{"name": "鈴木", "age": 35},
]
sorted_users = sorted(users, key=lambda user: user["age"], reverse=True)
print(sorted_users)
よくあるつまずきポイント・エラー対処
sort()の戻り値をそのまま使おうとしてハマる
これは筆者自身も実際にやってしまったミスです。
sort()は元のリストを直接書き換えるだけなので、戻り値を変数に代入して使おうとすると意図しない結果になります。
❌ Before(意図しない書き方)
numbers = [5, 2, 8, 1, 9]
sorted_numbers = numbers.sort()
print(sorted_numbers)
実行すると、次のように表示されます。
None
「並び替えたリストを新しい変数に入れたい」というつもりで書いたのに、Noneが返ってきて一瞬固まりました。
sort()はあくまで元のリストを書き換えるだけで、何かを返す関数ではないことを忘れていたのが原因です。
✅ After(正しい書き方)
新しい変数に結果を入れたい場合は、sorted()を使うのが正解です。
numbers = [5, 2, 8, 1, 9]
sorted_numbers = sorted(numbers)
print(sorted_numbers)
実行結果は次の通りです。
[1, 2, 5, 8, 9]
「元のリストも書き換えていい」のか「元のリストは残しておきたい」のかで、使う関数を選ぶ習慣をつけると、このミスは防げます。
まとめ
この記事のポイント
sorted()は新しいリストを返し、元のリストは変更しないsort()は元のリストを直接書き換える破壊的メソッドで、戻り値はNonekey引数を使うと、独自の基準で並び替えができるreverse=Trueで降順に並び替えられる- 元のリストを残したいなら
sorted()、その場で書き換えたいならsort()を使う
次に読むべき記事
- リスト内包表記の書き方と使いどころ
- enumerate()でインデックス付きループを書く
- zip()で複数のリストをまとめて処理する
タグ: Python, 初心者向け, 基本文法