1. 3件が金額の高い順に並ぶ
  2. すでに降順のリストはそのままの並びになる
  3. 0円の支出はいちばん後ろに来る
  4. 1件だけのときはそのまま返る
  5. 空リストのときは空リストが返る
コース一覧
Python入門:基礎文法編
keyでソート

Python入門:基礎文法編

変数、条件分岐、ループ、関数、リスト・辞書、ファイル操作など Python の基礎文法を、ブラウザ上で毎レッスン実際にコードを書き、自分だけの「おこづかい帳アプリ」を育てながら学べる無料コースです。プログラミング完全未経験から始められ、環境構築や事前知識は一切不要です。約 18 時間 (1 日 30 分 × 37 日) で 74 レッスンを修了でき、修了後は入力・集計・ファイル保存まで備えたスクリプトを1から書けるようになります。

1
はじめての Python
01. printで表示15分
02. 文字列の連結15分
03. 四則演算15分
04. 実行順序15分
05. コメント15分
06. エラーを読んでみる15分
07. つくる:レシート表示15分
08. 第1章クイズ10分
2
変数とデータ型
01. 変数15分
02. typeで型を調べる15分
03. 数値への変換15分
04. 文字列への変換15分
05. boolとNone15分
06. f-string15分
07. 入力を受け取る15分
08. つくる:入力できるおこづかい帳15分
09. 第2章クイズ10分
3
演算子と式
01. 比較演算子15分
02. 論理演算子15分
03. in演算子15分
04. 剰余と切り捨て除算15分
05. 連鎖比較と優先順位15分
06. 三項演算子15分
07. つくる:予算チェック15分
08. 第3章クイズ10分
4
条件分岐
01. if文の基本15分
02. if / elif / else15分
03. 条件の組み合わせ15分
04. match文15分
05. 定番:FizzBuzz判定15分
06. デフォルト値とor15分
07. つくる:カテゴリ自動判定15分
08. 第4章クイズ10分
5
ループ
01. forで合計15分
02. whileで繰り返す15分
03. rangeとstep15分
04. breakとcontinue15分
05. enumerateで番号付け15分
06. zipで組み合わせ15分
07. 入れ子ループ15分
08. つくる:何件でも記録15分
09. 第5章クイズ10分
6
関数
01. 関数を定義する15分
02. 引数と戻り値15分
03. デフォルト引数15分
04. キーワード引数15分
05. 複数の戻り値15分
06. divmod15分
07. 変数のスコープ15分
08. lambda関数15分
09. つくる:関数に分割15分
10. 第6章クイズ10分
7
リストと辞書
01. リストの追加と削除15分
02. スライス15分
03. 辞書の基本15分
04. 辞書を走査15分
05. keyでソート15分
06. setで重複除去15分
07. リスト内包表記15分
08. タプルアンパック15分
09. つくる:カテゴリ別集計15分
10. 第7章クイズ10分
8
ファイルとエラー処理
01. ファイルを読み込む15分
02. ファイルに書き込む15分
03. withで安全に扱う15分
04. CSV形式で保存15分
05. try-exceptで備える15分
06. 例外の種類15分
07. つくる:保存機能15分
08. 第8章クイズ10分
9
総合制作
01. 全機能を統合しよう15分
02. 月間レポート機能15分
03. 自由拡張15分
04. 完成と次のステップ10分

keyでソート

key で並べ方の基準を変える

辞書のリストは、そのままでは並べ替えられない

数値のリストなら、sorted に渡すだけで並びます。

Python

prices = [320, 120, 1800, 200] print(sorted(prices)) print(sorted(prices, reverse=True))

[120, 200, 320, 1800] と [1800, 320, 200, 120] が出ます。既定は小さい順で、reverse=True を足すと大きい順になります。sorted は 新しいリスト を返すので、元の prices は並び替わりません。

ところが支出の記録は、辞書が並んだリストです。これをそのまま sorted に渡すと TypeError になります。辞書と辞書のどちらが大きいか、Python は決められないからです。

何を物差しにするかを、こちらから教える

sorted には key という引数があります。ここに関数を渡すと、sorted は要素を 1 つずつその関数に通し、返ってきた値どうし を比べます。

Python

records = [ {"name": "りんご", "price": 120, "category": "食費"}, {"name": "映画", "price": 1800, "category": "娯楽"}, ] result = sorted(records, key=lambda r: r["name"])

lambda r: r["name"] は「r を受け取って品名を返す小さな関数」です。品名を物差しにしたので、辞書は品名の順に並びます。def で名前を付けるほどでもない処理をその場に書ける、というのが lambda の使いどころでした。物差しを別のキーに変えれば、その基準で並びます。

大事なのは、並ぶのは物差しの値ではなく元の辞書のまま ということです。key は比べるためだけに使われ、結果のリストに入るのは元の要素です。ここを取り違えると「品名のリストが返ると思ったのに辞書が返る」と戸惑います。

渡すのは関数そのもので、呼ぶのは sorted の仕事です。key=lambda r: r["name"]() のようにかっこを足すと関数ではなくなります。key と reverse はどちらも名前を書いて渡すキーワード引数なので、sorted(records, lambda r: r["name"]) のように名前を省くとエラーになります。

元の並びを壊さずに済む

sorted と似た名前で records.sort() というメソッドもあります。こちらは元のリストを並べ替えてしまい、戻り値は None です。records = records.sort() と書いて中身を丸ごと失う事故が起きやすいので、このコースでは sorted に統一します。

同じ物差しの値が並んだときは、順番が入れ替わりません。元の並びが保たれるので、何度実行しても同じ結果になります。降順にしたいときに sorted(...)[::-1] で見た目だけ逆にすると、この性質が崩れます。逆順が必要なら reverse を使います。

やってみよう

関数 sort_by_price_desc(records) を実装してください。支出の辞書が並んだリストを、price の大きい順に並べ替えた 新しいリスト を return します。

key に金額を返す lambda を渡し、大きい順にする指定を足せば 1 行で書けます。元のリストは書き換えず、sort メソッドではなく sorted を使ってください。空リストのときは空リストがそのまま返ります。

要件

  1. 関数名は sort_by_price_desc で、引数は records の1つ
  2. sorted の key に lambda を渡し、price を基準にする
  3. reverse=True を指定して金額の大きい順にする
  4. 元のリストを書き換えず、新しいリストを return する

入出力例

sort_by_price_desc([{"category":"食費","name":"りんご","price":120},{"category":"娯楽","name":"映画","price":1800},{"category":"交通費","name":"電車代","price":320}]) → [{"category":"娯楽","name":"映画","price":1800},{"category":"交通費","name":"電車代","price":320},{"category":"食費","name":"りんご","price":120}] sort_by_price_desc([{"category":"娯楽","name":"映画","price":1800},{"category":"日用品","name":"ノート","price":200}]) → [{"category":"娯楽","name":"映画","price":1800},{"category":"日用品","name":"ノート","price":200}] sort_by_price_desc([{"category":"その他","name":"試供品","price":0},{"category":"食費","name":"牛乳","price":180},{"category":"日用品","name":"ペン","price":150}]) → [{"category":"食費","name":"牛乳","price":180},{"category":"日用品","name":"ペン","price":150},{"category":"その他","name":"試供品","price":0}] sort_by_price_desc([{"category":"食費","name":"りんご","price":120}]) → [{"category":"食費","name":"りんご","price":120}] sort_by_price_desc([]) → []

ヒント

sorted(records, key=lambda r: r["price"], reverse=True) の形です

key には関数そのものを渡します。かっこを付けて呼び出してはいけません

key と reverse は名前を書いて渡すキーワード引数です

records.sort() は元を書き換えて None を返すので使いません

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/08/05·更新 2026/08/26

関連レッスン

  • setで重複除去

    set で重複を消し、sorted で並びを固定して使ったカテゴリ一覧を作る

  • リスト内包表記

    for と if を1行に畳むリスト内包表記で、食費の支出だけを抜き出す

  • タプルアンパック

    2つの値の組を変数に分解して受け取り、品名と金額を1行の文字列にまとめる

  • つくる:カテゴリ別集計

    第7章の総仕上げ。支出をカテゴリごとに合計した辞書を返す total_by_category を作る

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • リスト順序付きで複数の値を扱うデータ構造
  • 引数位置引数=順番で渡す。
  • 関数処理に名前を付けて再利用できる単位
  • 処理計算や代入を表す長方形
  • lambda名前のない小さな関数を1行で定義する記法。
  • メソッドクラスに属する関数
  • 戻り値呼び出し元への返答を表す点線矢印
main.py
学習モード
エディタを読み込んでいます

メモ

keyでソート

⌘S で保存