Pythonのsorted入門!key引数とlambdaで辞書のリストを点数順・日付順・複数条件で並べ替える
「リストを点数の高い順に並べたいのに、sort()したら None が返ってきた…」
「辞書のリストを sorted() したらエラーになった。どう書けばいいの?」
並べ替えはPythonで毎日のように使うのに、意外とつまずきやすいところですよね。
この記事では、sorted() と sort() の違いから、key引数とlambdaを使った「何で並べるか」の指定、同点のときの2つ目の条件までを、実際に動かしたコードで一緒に見ていきましょう!
対象は、リストと辞書の基本がわかる初心者の方です。最後まで読めば、成績表やデータを思いどおりの順番に並べられるようになりますよ😊
sorted() と sort() の違い:新しいリストか、元のリストか

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=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レッスンは登録なしで読めます。
こちらも読まれています
📚 関連商品・おすすめ書籍
※本記事にはアフィリエイトリンクが含まれます。




