Pythonでデータを扱っていると、リスト内の要素を小さい順や大きい順に並べ替えたい場面があります。
例えば、商品の価格を安い順に表示したり、テストの点数を高い順に並べたりする場合です。
Pythonでリストをソートする主な方法は、「sort()」と「sorted()」の2つです。どちらも要素を並べ替えられますが、元のリストを変更するかどうかに違いがあります。
この記事では、基本的なソート方法から、降順や独自の基準で並べ替える方法まで初心者向けに解説します。
ソートとは
ソートとは、決められた基準に従ってデータを並べ替えることです。
数値であれば、小さい順や大きい順に並べられます。
元のリスト:30、10、40、20
小さい順 :10、20、30、40
大きい順 :40、30、20、10小さい順の並びを「昇順」、大きい順の並びを「降順」と呼びます。
文字列の場合は、文字の並び順を基準にソートされます。
sort()で元のリストを並べ替える
リストの「sort()」を使うと、要素を昇順に並べ替えられます。
# 数値のリスト
numbers = [30, 10, 40, 20]
# 小さい順に並べ替える
numbers.sort()
print(numbers) # [10, 20, 30, 40]「sort()」は、元のリストそのものを変更します。
numbers = [30, 10, 40, 20]
print("並べ替え前:", numbers)
numbers.sort()
print("並べ替え後:", numbers)実行結果は次のようになります。
並べ替え前: [30, 10, 40, 20]
並べ替え後: [10, 20, 30, 40]並べ替え前の順番を残す必要がない場合は、「sort()」を使うと分かりやすいでしょう。
sorted()で新しいリストを作る
元のリストを変更せず、並べ替えた新しいリストを作りたい場合は、「sorted()」を使います。
# 元のリスト
numbers = [30, 10, 40, 20]
# 並べ替えた新しいリストを作る
sorted_numbers = sorted(numbers)
print(numbers) # [30, 10, 40, 20]
print(sorted_numbers) # [10, 20, 30, 40]元の「numbers」は変更されていません。
入力時の順番とソート後の順番を両方使いたい場合は、「sorted()」が適しています。
「sorted()」はリスト以外のデータにも使える関数ですが、初心者のうちは「元のリストを残して並べ替える方法」と覚えておくとよいでしょう。
sort()とsorted()の違い
「sort()」と「sorted()」の最も大きな違いは、元のリストを変更するかどうかです。
- 「sort()」:元のリストを直接並べ替える
- 「sorted()」:並べ替えた新しいリストを作る
次のコードで違いを確認できます。
numbers_a = [3, 1, 2]
numbers_b = [3, 1, 2]
# 元のリストを変更する
numbers_a.sort()
# 新しいリストを作る
sorted_numbers = sorted(numbers_b)
print(numbers_a) # [1, 2, 3]
print(numbers_b) # [3, 1, 2]
print(sorted_numbers) # [1, 2, 3]どちらを使うか迷ったときは、「元の順番をあとで使うか」を考えてみましょう。
元の順番が必要なら「sorted()」、不要なら「sort()」という基準で選べます。
降順に並べ替える
大きい順に並べ替える場合は、「reverse=True」を指定します。
# テストの点数
scores = [72, 91, 65, 84]
# 大きい順に並べ替える
scores.sort(reverse=True)
print(scores) # [91, 84, 72, 65]「sorted()」でも同じ指定が使えます。
scores = [72, 91, 65, 84]
# 元のリストを残して大きい順に並べる
high_to_low = sorted(scores, reverse=True)
print(scores) # [72, 91, 65, 84]
print(high_to_low) # [91, 84, 72, 65]「reverse」は「逆にする」という意味です。
通常の昇順を逆にすることで、降順に並べ替えています。
sort()の結果を変数に代入しない
初心者が間違えやすいのが、「sort()」の実行結果を変数へ代入する書き方です。
numbers = [3, 1, 2]
# この書き方ではsorted_numbersがNoneになる
sorted_numbers = numbers.sort()
print(sorted_numbers) # None「sort()」は元のリストを直接変更しますが、並べ替えたリストを戻り値として返しません。戻り値は「None」です。
そのため、「sort()」は代入せずに使います。
numbers = [3, 1, 2]
# 元のリストを直接並べ替える
numbers.sort()
print(numbers) # [1, 2, 3]並べ替えた結果を別の変数に保存したい場合は、「sorted()」を使います。
numbers = [3, 1, 2]
# 新しいリストとして保存する
sorted_numbers = sorted(numbers)
print(sorted_numbers) # [1, 2, 3]「sort()」は動作を行うメソッド、「sorted()」は結果を返す関数と考えると違いを覚えやすくなります。
文字列を並べ替える
文字列のリストもソートできます。
# 英単語のリスト
words = ["orange", "apple", "banana"]
# 文字の並び順でソート
words.sort()
print(words) # ['apple', 'banana', 'orange']ただし、大文字と小文字が混ざっている場合は、見た目から想像した順番にならないことがあります。
words = ["banana", "Apple", "orange", "apple"]
words.sort()
print(words) # ['Apple', 'apple', 'banana', 'orange']大文字と小文字を区別せずに並べたい場合は、「key=str.lower」を指定します。
words = ["banana", "Apple", "orange", "apple"]
# 小文字に変換した値を基準に並べ替える
words.sort(key=str.lower)
print(words) # ['Apple', 'apple', 'banana', 'orange']「key」は、要素そのものを変更する指定ではありません。並べ替えるときだけ、どの値を基準に比較するかを決めています。
文字数を基準に並べ替える
文字列の長さを基準に並べ替えたい場合は、「key=len」を指定します。
words = ["elephant", "cat", "apple", "dog"]
# 文字数が少ない順に並べ替える
words.sort(key=len)
print(words) # ['cat', 'dog', 'apple', 'elephant']文字数が多い順にしたい場合は、「reverse=True」も追加します。
words = ["elephant", "cat", "apple", "dog"]
# 文字数が多い順に並べ替える
words.sort(key=len, reverse=True)
print(words) # ['elephant', 'apple', 'cat', 'dog']このように、「key」を指定すると、通常とは異なる基準でソートできます。
リストの中のデータを指定してソートする
商品名と価格を組にしたリストを、価格順に並べることもできます。
# [商品名, 価格]のリスト
products = [
["ノート", 180],
["ペン", 120],
["ファイル", 250]
]
# 各要素のインデックス1にある価格で並べ替える
products.sort(key=lambda product: product[1])
print(products)実行結果は次のとおりです。
[['ペン', 120], ['ノート', 180], ['ファイル', 250]]「lambda product: product[1]」は、各商品のインデックス「1」にある価格を比較に使うという意味です。
難しく見える場合は、「商品データから価格だけを取り出して比べている」と考えてください。
価格が高い順に並べる場合は、「reverse=True」を追加します。
products = [
["ノート", 180],
["ペン", 120],
["ファイル", 250]
]
# 価格が高い順に並べ替える
products.sort(
key=lambda product: product[1],
reverse=True
)
print(products)「key」で比較する項目を決め、「reverse」で並びの向きを決めています。
複数の基準でソートする
点数が同じ場合だけ、名前順に並べるといった処理もできます。
# [名前, 点数]のリスト
students = [
["佐藤", 80],
["田中", 90],
["鈴木", 80]
]
# 点数を第1基準、名前を第2基準にする
students.sort(key=lambda student: (student[1], student[0]))
print(students)「key」でタプルを返すと、左側の値から順番に比較されます。
この例では、最初に点数を比較し、点数が同じ場合に名前を比較します。
ソートは「小さい順」「大きい順」だけではありません。「何を優先して並べるか」を決める処理でもあります。
数値と文字列を混ぜるとエラーになる
Pythonでは、数値と文字列をそのまま比較してソートできません。
# 数値と文字列が混ざっている
values = [10, "20", 5]
# 数値と文字列を比較できないためエラーになる
values.sort()引用符で囲まれた「”20″」は文字列です。
すべて数値として並べたい場合は、先に型をそろえます。
values = [10, "20", 5]
# すべて整数へ変換
number_values = [int(value) for value in values]
# 数値として並べ替える
number_values.sort()
print(number_values) # [5, 10, 20]ソートするときは、リスト内の要素が同じ基準で比較できる状態になっているか確認しましょう。
同じ基準の要素は元の順番を保つ
Pythonのソートでは、比較結果が同じ要素は元の順番を保ちます。
例えば、文字数が同じ「cat」と「dog」は、元のリストに登場した順番のままです。
words = ["apple", "cat", "dog", "banana"]
# 文字数を基準にソート
words.sort(key=len)
print(words) # ['cat', 'dog', 'apple', 'banana']「cat」と「dog」は、どちらも3文字です。そのため、元の順番である「cat」「dog」が維持されています。
この性質を使うと、複数の条件を段階的に整理しやすくなります。
ソート方法の選び方
リストをソートするときは、次の基準で方法を選ぶと分かりやすくなります。
- 元のリストを直接並べ替える:「sort()」
- 元のリストを残す:「sorted()」
- 大きい順に並べる:「reverse=True」
- 文字数や価格などで並べる:「key」
- 並べ替えた結果を別の変数に保存する:「sorted()」
ソートで重要なのは、関数名を覚えることだけではありません。
「元の順番を残すか」「何を基準にするか」「昇順と降順のどちらにするか」の3つを先に決めると、適切なコードを選びやすくなります。
まとめ
Pythonでリストを並べ替える主な方法は、「sort()」と「sorted()」です。
numbers = [30, 10, 40, 20]
# 元のリストを昇順に並べ替える
numbers.sort()
print(numbers) # [10, 20, 30, 40]元のリストを残したい場合は、「sorted()」を使います。
numbers = [30, 10, 40, 20]
# 並べ替えた新しいリストを作る
sorted_numbers = sorted(numbers)
print(numbers) # [30, 10, 40, 20]
print(sorted_numbers) # [10, 20, 30, 40]この記事で紹介したポイントは次のとおりです。
- 「sort()」は元のリストを直接並べ替える
- 「sorted()」は並べ替えた新しいリストを作る
- 「reverse=True」で降順にできる
- 「key」を使うと比較の基準を変更できる
- 「sort()」の実行結果を変数へ代入すると「None」になる
- 数値と文字列が混ざった状態ではソートできない
- 比較結果が同じ要素は元の順番を保つ
リストのソートは、単にデータをきれいに並べる処理ではありません。
何を基準に、どちらの方向へ、元のデータを残すかどうかを決める処理です。この3点を意識すると、目的に合ったソートを書けるようになります。

