sortedとkeyの応用

このレッスンでできるようになること。sorted の key にタプルを返す関数を渡して、複数の条件を組み合わせた並べ替えができるようになります。

sorted(リスト, key=関数) は、要素そのものではなく「関数に通した結果」を基準に並べ替えます。並べ替え用の値を取り出す関数を渡す、という意味で sorted も高階関数です。

expenses = [ {"name": "牛乳", "amount": 220}, {"name": "書籍", "amount": 2035}, ] by_amount = sorted(expenses, key=lambda e: e["amount"])

条件を2つ以上重ねたいときは、key でタプルを返します。タプルは前の要素から順に比べられるので、(カテゴリ, 金額) を返せばカテゴリ順に並び、同じカテゴリの中では金額順に並びます。降順にしたい数値はマイナスを付けると、昇順のまま逆順を表せます。

ordered = sorted(expenses, key=lambda e: (e["category"], -e["amount"]))

ここで気を付けたいのが、キーが完全に同じ要素が複数あるときです。Python の sorted は安定ソートなので元の順序を保ちますが、元データの並びが変われば結果も変わり、外から見ると「並びが安定しない」ように見えます。そこで、最後に品名のような重複しない値をキーへ足しておきます。(カテゴリ, -金額, 品名) まで指定すれば順序は一意に決まり、いつ何度実行しても同じ結果になります。

なお sorted は新しいリストを返し、元のリストは変えません。元のデータを残したまま別の並びが欲しいときに使う道具だと覚えてください。

要件

  1. sorted の key にタプルを返す関数を渡す
  2. カテゴリ昇順、金額降順、品名昇順の順で比べる
  3. 並べ替えた結果の品名だけをリストで返す

入出力例

sort_expenses([{"amount":220,"category":"食費","name":"牛乳"},{"amount":1280,"category":"食費","name":"コーヒー豆"},{"amount":1280,"category":"食費","name":"紅茶"},{"amount":640,"category":"交通費","name":"電車代"},{"amount":640,"category":"交通費","name":"バス代"},{"amount":2035,"category":"教養費","name":"書籍"}])["バス代","電車代","書籍","コーヒー豆","紅茶","牛乳"] sort_expenses([{"amount":165,"category":"教養費","name":"ノート"},{"amount":800,"category":"食費","name":"昼食"},{"amount":800,"category":"食費","name":"夕食"},{"amount":9500,"category":"交通費","name":"定期券"}])["定期券","ノート","夕食","昼食"]

ヒント

生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア
編集 LuaGate編集部
main.py
学習モード

メモ

sortedとkeyの応用

⌘S で保存