mei_13のPython講座 ロゴ

【解説】Pythonのリストを自在に操る!データの並び替え(ソート)をマスターしよう




🐍 初心者歓迎!月額4,000円で質問し放題のPython講座
(1時間4,000円の伴走型ビデオチャット指導も受付中!)
🚀 講座の詳細を見る 📩 質問・お問い合わせ

Pythonのリストを自在に操る!データの並び替え(ソート)をマスターしよう


Yukiのアイコン
【Yuki】 Hirokiくん、こんにちは。今日はPythonでデータを扱う上でとても大切な「ソート(並び替え)」について、一緒に勉強していきましょうか。

プログラミングをしていると、バラバラに並んだ数字を小さい順に並べたり、名簿を名前順に整理したりしたい場面がよく出てくるんです。Pythonには、そういった操作をとても簡単に、そして高度に行うための仕組みが備わっているんですよ……。


Hirokiのアイコン
【Hiroki】 Yukiさん、よろしくお願いします! ソートって、Excelの並び替えみたいなイメージですよね。プログラミングでやろうとすると、アルゴリズムとかが難しそうなイメージがあるんですけど、Pythonなら簡単にできるんでしょうか?


Yukiのアイコン
【Yuki】 ええ、大丈夫ですよ。Pythonには非常に強力で使いやすい標準機能があるので、アルゴリズムの深い知識がなくても、まずは使いこなすことから始められます。 まずは、一番基本となる2つの方法から見ていきましょう。

1. 「sortメソッド」と「sorted関数」の違い


Yukiのアイコン
【Yuki】 Pythonでリストをソートするには、大きく分けて2つの方法があります。 一つはリスト自体の順番を書き換える「sortメソッド」、もう一つは元のリストはそのままに、新しく並び替えたリストを作る「sorted関数」です。

まずは、こちらのコードを見てみてください。

# 元のリスト
numbers = [5, 2, 9, 1, 5, 6]

# 1. sortメソッド(破壊的処理)
numbers.sort()
print(f"sortメソッドの結果: {numbers}")

# 再びバラバラなリストを用意します
data = [10, 3, 7, 2]

# 2. sorted関数(非破壊的処理)
new_data = sorted(data)
print(f"元のリスト: {data}")
print(f"sorted関数の結果: {new_data}")


Hirokiのアイコン
【Hiroki】 なるほど。numbers.sort()を実行すると、numbersという変数の中身そのものが書き換わってしまうんですね。 一方で、sorted(data)の方は新しいリストを返してくれるから、元のdataは変わらない……ということですか?


Yukiのアイコン
【Yuki】 その通りです、よく理解できましたね。 専門的な言葉では、元のデータを書き換えてしまうことを「破壊的」、書き換えないことを「非破壊的」と呼んだりします。 元のデータを後でまた使いたい場合は sorted() を使い、メモリを節約したり、元の順番を気にする必要がない場合は sort() を使うのが一般的だと思います……。


Hirokiのアイコン
【Hiroki】 使い分けが大事なんですね。ちなみに、今は数字でしたけど、文字列でも同じようにできるんですか?


Yukiのアイコン
【Yuki】 はい、もちろんできますよ。文字列の場合は、基本的に「辞書順(文字コード順)」で並び替えられます。 例えば、アルファベットならAからZの順、日本語なら五十音順のようなイメージですね。ただし、英単語の大文字と小文字が混ざっているときは少し注意が必要なのですが……それは後で「キー(key)」の話をするときに詳しく説明しますね。

2. 降順(大きい順)に並び替える方法


Hirokiのアイコン
【Hiroki】 今は小さい順(昇順)でしたけど、逆に大きい順(降順)にしたいときはどうすればいいんですか?


Yukiのアイコン
【Yuki】 それはとても簡単です。sort()sorted() も、引数に reverse=True という指定を追加するだけでいいんですよ。

numbers = [1, 5, 2, 9, 6]

# 降順にソート
numbers.sort(reverse=True)
print(f"降順の結果: {numbers}")

# sorted関数でも同様です
sorted_list = sorted([3, 1, 4], reverse=True)
print(f"sortedでの降順: {sorted_list}")


Hirokiのアイコン
【Hiroki】 reverse=True を加えるだけなんですね。これならすぐに覚えられそうです!


Yukiのアイコン
【Yuki】 ええ、シンプルですよね。 デフォルト(何も指定しない状態)では reverse=False になっていて、昇順になるようになっています。

3. 「key」引数を使った高度なソート


Yukiのアイコン
【Yuki】 ここからがPythonのソートの面白いところです。 「単に値の大きさで比べるのではなく、特定のルールに基づいて並び替えたい」という場合に、key という引数を使います。 例えば、「文字列の長さが短い順」に並び替えたい、といった場合ですね。


Hirokiのアイコン
【Hiroki】 文字列の長さ順……? 普通にソートすると辞書順になっちゃいますもんね。どう書くんですか?


Yukiのアイコン
【Yuki】 key に「関数」を渡してあげるんです。次の例を見てください。

words = ["python", "is", "awesome", "and", "flexible"]

# 文字の長さ(len関数)を基準にソート
sorted_words = sorted(words, key=len)
print(f"長さ順: {sorted_words}")


Hirokiのアイコン
【Hiroki】 あ、key=len って書くんですね! len("python") みたいにカッコを付けなくていいんですか?


Yukiのアイコン
【Yuki】 はい、そこがポイントです。ここでは「関数そのもの」を渡して、「それぞれの要素にこの関数を適用した結果で比較してね」とお願いしている状態なんです。 カッコを付けてしまうと関数の実行結果になってしまうので、注意してくださいね。


Hirokiのアイコン
【Hiroki】 なるほど……。関数を引数に渡すっていうのは、少し不思議な感じがしますけど、すごく便利ですね。


Yukiのアイコン
【Yuki】 そうですね。これを使うと、例えば「大文字・小文字を区別せずに辞書順で並べる」といったこともできます。 通常、Pythonのソートでは大文字の「A」の方が小文字の「a」よりも先に来るのですが、key=str.lower を指定すれば、すべて小文字として扱って比較してくれるようになるんですよ。

4. ラムダ式(無名関数)を使ったソート


Yukiのアイコン
【Yuki】 さらに一歩進んで、もっと複雑なデータを扱う方法を見ていきましょう。 実務でよくあるのが、「辞書(dict)が複数入ったリスト」を、特定のキーの値でソートしたい、というケースです。 ここで「ラムダ式(lambda)」というものを使うと、とてもスマートに書けます……。


Hirokiのアイコン
【Hiroki】 ラムダ式……名前は聞いたことありますけど、なんだか難しそうで敬遠してました。


Yukiのアイコン
【Yuki】 名前は少し強そうですけど、使い方はそんなに怖くないですよ。 「その場限りの使い捨ての関数」を作るための書き方だと思ってください。 例えば、学生の「名前」と「点数」が入った辞書のリストを、点数の高い順に並べ替えてみましょうか。

students = [
    {"name": "Hiroki", "score": 85},
    {"name": "Yuki", "score": 98},
    {"name": "Mei", "score": 92}
]

# scoreの値を基準に、降順(reverse=True)でソート
# lambda student: student["score"] は、
# 「学生データを受け取って、そのscoreを返す」という意味です
sorted_students = sorted(students, key=lambda s: s["score"], reverse=True)

for student in sorted_students:
    print(f"{student['name']}: {student['score']}点")


Hirokiのアイコン
【Hiroki】 おお……! lambda s: s["score"] の部分で、どの値を見てソートするかを指定しているんですね。 s がリストの中の一個一個のデータ(辞書)を指していて、その中の "score" を見ろ、という指示……で合っていますか?


Yukiのアイコン
【Yuki】 完璧な理解です、Hirokiくん。 このラムダ式を使えるようになると、どんなに複雑なデータ構造でも自由自在に並び替えられるようになります。 例えば「2つの要素でソートしたい(第1基準が点数、同じ点数なら名前順)」という場合も、ラムダ式でタプルを返すようにすれば実現できるんですよ。

# スコア(降順)、同点なら名前(昇順)
sorted_complex = sorted(students, key=lambda s: (-s["score"], s["name"]))


Hirokiのアイコン
【Hiroki】 マイナスを付けることで降順を表現するなんて、トリッキーですけど賢いですね!

5. operatorモジュールを使った効率化


Yukiのアイコン
【Yuki】 実は、先ほどの「辞書の特定のキーでソートする」といった操作は、Pythonの標準ライブラリである operator モジュールを使うともっと速く、そして読みやすく書ける場合があります。 「自分でも書けるけれど、専用の道具を使う」という感じでしょうか。

from operator import itemgetter

students = [
    {"name": "Hiroki", "score": 85},
    {"name": "Yuki", "score": 98},
    {"name": "Mei", "score": 92}
]

# itemgetterを使って"score"キーを指定
sorted_students = sorted(students, key=itemgetter("score"))


Hirokiのアイコン
【Hiroki】 itemgetter……文字通り「アイテム(要素)を取得するもの」ですね。 ラムダ式より少しスッキリ見える気がします。


Yukiのアイコン
【Yuki】 そうですね。単純なキーの取り出しであれば、こちらの方が動作が高速だと言われています。 ただ、ラムダ式の方が汎用性が高いので、状況に応じて使い分けるのが良いと思います。

6. ソートの安定性(Stability)について


Yukiのアイコン
【Yuki】 Hirokiくん、最後に少しだけ専門的な、でも知っておくと得をするお話をしてもいいでしょうか? Pythonのソートは「安定なソート(Stable Sort)」であることが保証されているんです。


Hirokiのアイコン
【Hiroki】 「安定」ですか? ソートの結果が変わったりすることがあるんですか?


Yukiのアイコン
【Yuki】 いえ、そういう意味ではなくてですね……。 「同じ値を持つ要素が複数あったとき、ソートする前と同じ順序関係が維持される」という意味なんです。

例えば、最初に「名前順」でソートされたリストがあったとします。 その後に、同じリストを「学年順」でソートし直したとしましょう。 このとき「安定なソート」であれば、同じ学年の中では、最初にソートした「名前順」が崩れずに維持されるんです。


Hirokiのアイコン
【Hiroki】 あ、なるほど! 複数の条件で段階的にソートしたいときに、前の条件が無駄にならないってことですね。


Yukiのアイコン
【Yuki】 その通りです。これを利用すると、先ほどのタプルを使った方法以外にも、複数の優先順位でのソートが簡単に行えるようになります。 優先度の低い順に何度もソートを繰り返せばいいんです。 Pythonのソートアルゴリズムは「Timsort(ティムソート)」という名前で、非常に効率的で賢い仕組みが採用されているんですよ……。


Hirokiのアイコン
【Hiroki】 Timsort……なんだか強そうな名前ですね。 Pythonのソート、奥が深いですが、基本を押さえればすごく強力な武器になりそうです。


Yukiのアイコン
【Yuki】 ええ、きっと役に立つはずです。 データを整理して美しく並べることは、プログラムの読みやすさや効率だけでなく、扱う人の気持ちを整えることにも繋がる……かもしれないですね。

最後に、今日学んだことの参考になる公式ドキュメントを紹介しておきます。 もっと詳しく知りたくなったときは、ぜひ読んでみてください。

Python ソート How-To 組み込み関数 sorted()


Hirokiのアイコン
【Hiroki】 ありがとうございます! まずは色々なデータを自分でソートしてみて、慣れていこうと思います。 また分からないことがあったら教えてください、Yukiさん!


Yukiのアイコン
【Yuki】 はい、いつでもどうぞ。 Hirokiくんのペースで、一歩ずつ進んでいきましょうね。 私も、Hirokiくんの学習を支えられるように、しっかり準備しておきますから……。



< YOLO
コラム一覧に戻る
主成分分析 (PCA) >

この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。

「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。

「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。

➡ ココナラで制作・相談を依頼する(見積もり無料)


初心者から始められるPythonレッスン

プログラミング未経験者・初心者歓迎!
月額4,000円で質問し放題!!
● 完全オンライン
● 翌日までには必ず返信
● 挫折しない独自の学習メソッド
● 圧倒的高評価!!
テキストベースで時間を選ばない
4,000円/60分伴走型ビデオチャット指導も可能
● 高品質なサンプルコード
詳細はこちら

📩 質問・お問い合わせはこちら



AIアシスタント Yuki