「リストを点数の高い順に並べたいのに、sort()したら None が返ってきた…」
「辞書のリストを sorted() したらエラーになった。どう書けばいいの?」

並べ替えはPythonで毎日のように使うのに、意外とつまずきやすいところですよね。

この記事では、sorted() と sort() の違いから、key引数とlambdaを使った「何で並べるか」の指定、同点のときの2つ目の条件までを、実際に動かしたコードで一緒に見ていきましょう!

対象は、リストと辞書の基本がわかる初心者の方です。最後まで読めば、成績表やデータを思いどおりの順番に並べられるようになりますよ😊

sorted() と sort() の違い:新しいリストか、元のリストか

sorted cards
sorted cards / Photo by Ron Lach via Pexels

Pythonには並べ替えの方法が2つあります。イメージとしては、sorted() は「並べ替えたコピーを作る」、sort() は「元のリストそのものを並べ替える」です。

scores = [72, 95, 58, 88, 95]

# sorted():元のリストはそのまま、並べ替えた「新しいリスト」を返す
new_list = sorted(scores)
print("sorted()の結果:", new_list)
print("元のリスト    :", scores)

# 大きい順にしたいときは reverse=True
print("大きい順      :", sorted(scores, reverse=True))

# list.sort():元のリストそのものを並べ替える(戻り値は None)
result = scores.sort()
print("sort()の戻り値:", result)
print("sort()後の元  :", scores)

実行すると、次のようになりました。

  • sorted(scores) は [58, 72, 88, 95, 95] を返し、元の scores は [72, 95, 58, 88, 95] のまま
  • reverse=True を付けると [95, 95, 88, 72, 58](大きい順)
  • scores.sort() の戻り値は None。そのかわり scores 自体が [58, 72, 88, 95, 95] に変わる

ここが重要です👇

  • sort() の戻り値は None。result = scores.sort() と書くと、result には何も入りません。冒頭の「None が返ってきた」はこれが原因です
  • 元のデータを残したいなら sorted()、元を書き換えてよいなら sort()
  • sorted() はリスト以外(タプル・文字列・辞書のキーなど)にも使えて、結果は必ずリストで返ってきます

迷ったら、まずは sorted() を使うと覚えておけば安全です。

key引数とlambdaで「何で並べるか」を指定する

次は、辞書のリストを並べ替えてみます。実務では「名前・点数・日付」がセットになったデータを並べることが多いですよね。

ところが、辞書のリストをそのまま sorted() に渡すとエラーになります。Pythonには「辞書と辞書のどちらが小さいか」が判断できないからです。

そこで使うのが key引数です。key には「各要素から、比べるための値を取り出す関数」を渡します。その関数を1行で書けるのが lambda(ラムダ式)です。

lambda s: s["score"] は、「要素 s を受け取って s["score"] を返す関数」という意味です。つまり「点数で比べてね」という指示になります。

students = [
    {"name": "佐藤", "score": 72, "date": "2026-10-03"},
    {"name": "鈴木", "score": 95, "date": "2026-09-28"},
    {"name": "高橋", "score": 58, "date": "2026-10-01"},
    {"name": "田中", "score": 88, "date": "2026-09-30"},
]

# そのまま sorted(students) とすると、辞書どうしは比べられずエラーになる
try:
    sorted(students)
except TypeError as e:
    print("エラー:", e)

# key に「何で比べるか」を返す関数を渡す
by_score = sorted(students, key=lambda s: s["score"], reverse=True)
print("--- 点数の高い順 ---")
for s in by_score:
    print(s["name"], s["score"])

# "YYYY-MM-DD" 形式の文字列は、そのまま並べても日付順になる
by_date = sorted(students, key=lambda s: s["date"])
print("--- 提出日の早い順 ---")
for s in by_date:
    print(s["name"], s["date"])
辞書のリストを点数順・日付順に並べた結果
辞書のリストを点数順・日付順に並べた結果

ポイントをまとめるとこんな感じです👇

  • key を付けないと '<' not supported between instances of 'dict' and 'dict' というエラーになる
  • key=lambda s: s["score"] で点数順、reverse=True で高い順
  • “2026-09-28” のような「年-月-日」形式の文字列は、文字列のまま並べても日付順になる(月・日が2桁にそろっているのが条件です)

同点なら2つ目の条件で並べる(タプルで複数条件)

ランキングを作ると「同点の人をどう並べるか」が気になりますよね。そんなときは、key でタプル(値の組)を返します。

タプルどうしの比較は、1つ目の値で比べて、同じなら2つ目の値で比べるというルールです。これを利用すると、複数条件の並べ替えが1行で書けます。

ここで1つ問題があります。「点数は高い順、日付は早い順」と、条件ごとに向きが違うときです。reverse=True は全体を逆にしてしまうので使えません。

点数のような数値なら、マイナスを付けると逆順になります。-95 は -88 より小さいので、小さい順に並べると点数の高い人が先に来る、というしくみです。

students = [
    {"name": "佐藤", "score": 88, "date": "2026-10-03"},
    {"name": "鈴木", "score": 95, "date": "2026-09-28"},
    {"name": "高橋", "score": 88, "date": "2026-09-29"},
    {"name": "田中", "score": 72, "date": "2026-09-30"},
    {"name": "伊藤", "score": 95, "date": "2026-10-02"},
]

# 点数は高い順、同点なら提出日の早い順
# タプルは「1つ目で比べ、同じなら2つ目で比べる」。数値はマイナスを付けると逆順になる
ranking = sorted(students, key=lambda s: (-s["score"], s["date"]))
for rank, s in enumerate(ranking, start=1):
    print(rank, s["name"], s["score"], s["date"])

# よくあるつまずき:数字が「文字列」のままだと辞書順になる
file_numbers = ["10", "9", "100", "2"]
print("文字列のまま:", sorted(file_numbers))
print("key=int     :", sorted(file_numbers, key=int))
点数→提出日の複数条件で並べた結果と、key=intの効果
点数→提出日の複数条件で並べた結果と、key=intの効果

ここが重要です👇

  • key=lambda s: (-s["score"], s["date"]) で「点数の高い順 → 同点なら提出日の早い順」
  • 95点の鈴木さんと伊藤さんは、提出日が早い鈴木さんが1位になった
  • 数字が文字列のままだと ['10', '100', '2', '9'] のように辞書順(1文字目から比べる順)になる。key=int で数値として比べれば ['2', '9', '10', '100'] になる

CSVから読み込んだ数字は文字列になっていることが多いので、「並び順がおかしいな?」と思ったら、まず型を疑ってみてください⚠️

ちなみに、Pythonの並べ替えは安定ソートです。比べる値が同じ要素どうしは、元の順番が保たれます。2つ目の条件を指定しなければ、同点の人は元のリストに並んでいた順のままになります。

まとめ

  • sorted() は並べ替えた新しいリストを返し、元はそのまま。sort() は元のリストを書き換え、戻り値は None
  • 大きい順にしたいときは reverse=True
  • 辞書のリストは key=lambda s: s["点数"] のように、key で「何で比べるか」を指定する
  • 複数条件は key でタプルを返す。向きを変えたい数値にはマイナスを付ける
  • 数字の文字列は key=int で数値として並べる

key と lambda がわかると、「むずかしそう」だった並べ替えが「できそう」に変わったのではないでしょうか。手元のデータで、ぜひ試してみてください🚀

\ 読んだら、次は自分で作ってみよう /

筆者が運営する無料の入門コース「作って学ぶPythonプログラミング入門」では、こうした基本文法を、割り勘計算機・おみくじ・数当てゲームなどを作りながら身につけます。各章末の定着ドリル(全42問)で、自分の手で書く練習まで。最初の4レッスンは登録なしで読めます。

→ 無料の入門コース(全7章52レッスン)を見てみる

📚 関連商品・おすすめ書籍

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

もしも

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

初心者に定番のPython入門書

Amazonで見る
徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

もしも

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

電子工作とプログラミングを同時に学べる

Amazonで見る
実践Claude Code入門―現場で活用するためのAIコーディングの思考法

もしも

実践Claude Code入門―現場で活用するためのAIコーディングの思考法

AIコーディングの現場活用法を学ぶ一冊

Amazonで見る

※本記事にはアフィリエイトリンクが含まれます。

ABOUT ME
やまちゃん
これまで学生と社会人を合わせて5000人以上にプログラミング学習を指導。 ゼロからイチをわかりやすく解説する専門家として活動しており、本業ではArduinoを用いたIoT開発とロボットプログラミングが専門。 Pythonを用いたアプリ開発、ウェブアプリケーションの開発で業務の効率化をサポートしています。