Pythonのリストをソート(並び替え)する方法!sort()とsorted()の違いと使い方
生徒
「Pythonでリストの中身を並び替えるにはどうすればいいですか?」
先生
「Pythonにはsort()とsorted()という2つの方法があるんだ。それぞれ特徴があるから、順番に説明していこう!」
生徒
「どちらを使えばいいのかわからなくなりそうです……」
先生
「大丈夫、順を追ってやっていけば理解できるよ。実際に例を使って学んでいこう!」
1. Pythonのリストとは?
まずはPythonのリストについておさらいしておきましょう。リストは、複数の値(データ)を1つにまとめて扱えるとても便利な仕組みです。たとえば、買い物リストや名前の一覧など、関連するデータをひとつにまとめたいときによく使われます。
リストは、角かっこ「[]」を使って作ります。中に入れるデータは、カンマで区切るだけでOKです。
例えば、次のようなコードで果物のリストを作れます。
fruits = ["りんご", "みかん", "バナナ"]
fruitsというリストには、「りんご」「みかん」「バナナ」という3つの文字列が入っています。番号のような順番がついているので、1番目だけ取り出す、最後だけ表示する、といった使い方もできます。リストを使うことで、バラバラのデータをひとまとめにして扱えるので、Pythonの基本機能の中でも特に出番の多い便利な仕組みです。
2. リストを並び替えるにはsort()とsorted()を使う
Pythonでリストを並び替える基本はsort()とsorted()の二つです。どちらも結果は「並び替えられた順序」ですが、動き方が違います。sort()は「その場で」リストの中身を書き換える一方、sorted()は「新しいリストを作って返す」ので元のデータは残ります。元を壊してよい一時的な並び替えならsort()、原本を保ちつつ結果だけ欲しいときや、リスト以外(タプル・集合・辞書のキーなど)にも使いたいときはsorted()が向いています。
まず、最小の例で違いを体験してみましょう。
nums = [5, 2, 9, 1]
ret = nums.sort() # その場で並び替え(in-place)
print(nums) # => [1, 2, 5, 9]
print(ret) # => None(戻り値は使えない)
[1, 2, 5, 9]
None
sort()は戻り値を返さないため、結果は変数retではなくnums側に反映されます。次はsorted()です。
nums = [5, 2, 9, 1]
new_nums = sorted(nums) # 新しいリストを返す
print(nums) # 元はそのまま
print(new_nums) # 並び替え済み
[5, 2, 9, 1]
[1, 2, 5, 9]
このように、元データを保持したい学習用ノートやログの加工ではsorted()が安心です。反対に、大量データを何度も並び替える場面で余計なコピーを避けたいときはsort()が手軽です。
どちらにも共通のオプションとして、reverse=True(大きい順)とkey=関数(並び替えの基準)が使えます。まずは逆順から。
nums = [3, 10, 1]
nums.sort(reverse=True) # その場で降順
print(nums)
[10, 3, 1]
keyは「何を基準に大小を決めるか」を指定します。文字列の長さで並び替える例です。
words = ["りんご", "みかん", "バナナ", "ぶどう"]
sorted_by_len = sorted(words, key=len) # 短い順
print(sorted_by_len)
['みかん', 'ぶどう', 'りんご', 'バナナ']
リスト以外の並び替えにもsorted()は有効です。例えばタプルは変更できませんが、sorted()なら並び替えた新しいリストを得られます。
t = (4, 1, 7)
print(sorted(t)) # => [1, 4, 7]
覚えておくと便利なポイントをまとめます。①元の配列を変えたいならsort()、変えたくないならsorted()。②どちらもreverseとkeyが使える。③sorted()はイテラブル全般に使えるので応用範囲が広い。まずは小さな配列で試し、目的に合わせて二つを使い分ける癖をつけると、後の章の比較や応用もすっと理解しやすくなります。
3. sort()の使い方と特徴
sort()は、リストそのものの中身を並び替えるメソッドです。「メソッド」とは、リストが自分自身に対して使う操作のことです。
たとえば、次のように使います。
numbers = [5, 2, 9, 1]
numbers.sort()
print(numbers)
[1, 2, 5, 9]
sort()はリスト自体を直接並び替えるので、元の順番は残りません。
4. sorted()の使い方と特徴
sorted()は、元のリストを変更せずに、新しく並び替えたリストを返してくれる関数です。「関数」とは、入力を受け取って処理をし、結果を返すものです。
numbers = [5, 2, 9, 1]
new_numbers = sorted(numbers)
print("元のリスト:", numbers)
print("並び替えたリスト:", new_numbers)
元のリスト: [5, 2, 9, 1]
並び替えたリスト: [1, 2, 5, 9]
このように、sorted()は元のデータを残したまま新しい順番のリストを作ってくれます。
5. sort()とsorted()の違いをわかりやすく比較
ここで、2つの違いを簡単に表でまとめます。
| 項目 | sort() | sorted() |
|---|---|---|
| データの変更 | 元のリストを変更する | 元のリストはそのまま |
| 戻り値 | なし(Noneを返す) |
新しいリストを返す |
| 使う場所 | リスト専用 | リスト以外にも使える |
6. 昇順・降順の並び替え(小さい順・大きい順)
並び替えのときに、順番を指定するにはreverse=Trueというオプションを使います。
小さい順(昇順)は何もしない場合のデフォルトです。大きい順(降順)にするには以下のように書きます。
numbers = [5, 2, 9, 1]
numbers.sort(reverse=True)
print(numbers)
[9, 5, 2, 1]
7. 文字列の並び替えもできる
リストの中に文字列がある場合も、並び替えができます。アルファベット順や五十音順で並びます。
fruits = ["りんご", "みかん", "バナナ", "ぶどう"]
fruits.sort()
print(fruits)
['みかん', 'りんご', 'ぶどう', 'バナナ']
この例では、日本語の文字コード順で並び替えられています。
8. ソートができない場合の注意点
リストの中に、数値と文字列が混ざっているとエラーになります。
mixed = [3, "りんご", 5]
mixed.sort()
TypeError: '<' not supported between instances of 'str' and 'int'
このように、異なる種類のデータが混ざっているとPythonは順番を決められません。全て同じ種類(数値だけ、文字列だけ)にそろえるようにしましょう。
9. 並び替えを使った活用例
並び替えは、成績の高い順や、商品の価格の安い順に並べたいときなど、さまざまな場面で活躍します。
prices = [1500, 500, 1200, 800]
cheap_to_expensive = sorted(prices)
print(cheap_to_expensive)
[500, 800, 1200, 1500]
このように、数字を並べることで見やすく整理できます。
まとめ
今回は、Pythonでリストを並び替えるための基本であるsort()とsorted()について学びました。リストは複数の値をひとまとめにして扱える便利なデータ構造であり、その並び順を操作できることで、データの整理や表示がとてもスムーズになります。
sort()はリスト自身を直接並び替えるメソッドであり、もとの順番は失われます。一方、sorted()は元のリストをそのまま残し、新しい並び順のリストを返してくれる関数でした。これらの違いをしっかり理解しておくことで、場面に応じた使い分けができるようになります。
また、並び替えには昇順(小さい順)と降順(大きい順)があり、引数reverse=Trueを使うことで簡単に変更できます。さらに、リストの中身が文字列の場合でも、五十音順やアルファベット順に並び替えることができ、汎用性の高さが魅力です。
一方で、リストに数値と文字列が混在しているとソートできないという注意点もありました。このようなケースでは、データを事前に整えておく必要があります。
並び替えは、成績の順位付け、商品の価格順、名前順の表示など、実際のアプリケーション開発やデータ分析でも頻繁に利用されます。シンプルな例から試し、どんなデータでもきれいに整える力を身につけておきましょう。
応用例:価格の安い順に商品を並び替える
例えば、以下のように商品価格のリストを並び替えると、値段の安い順に表示できます。
prices = [2800, 1200, 4500, 900, 3300]
sorted_prices = sorted(prices)
print("安い順:", sorted_prices)
安い順: [900, 1200, 2800, 3300, 4500]
このようにsorted()を使えば、元のリストを壊すことなく、安全に並び替えができます。
生徒
「先生、sort()とsorted()の違いって、なんとなく似てるけど結構大事だったんですね!」
先生
「そうだね。sort()は元のリストを並び替えるけど、sorted()は新しいリストを作ってくれるんだ。使い分けを覚えておくと便利だよ。」
生徒
「成績の順番や商品を安い順にしたいときも、すぐ使えそうです!」
先生
「そう。現実のデータ処理でもよく使うから、並び替えのテクニックは覚えておいて損はないよ。」
生徒
「異なる型が混ざってるとエラーになることも、注意しないとですね!」
先生
「その通り。Pythonのエラーはヒントをくれるから、よく読んで対応できるようにしておこうね。」