つくる 集計のリファクタ

このレッスンでできるようになること。第2章で for 文で書いた集計3つを、内包表記とジェネレータ式に書き直し、同じ結果になることを確かめられるようになります。

新しい文法はここでは出てきません。使うのは、この章で覚えたリスト内包表記、辞書内包表記、set 内包表記、ジェネレータ式の4つだけです。動いているコードを、結果を変えずに読みやすい形へ直す作業をリファクタリングと呼びます。中級で身に付けたい大事な技術のひとつです。

書き直すのは、家計簿の月次レポートが使っている次の3つの集計です。

  1. 月ごとの合計金額を出す処理。月をキー、合計を値とする辞書を作ります
  2. これまでに使ったカテゴリの一覧を出す処理。重複を落として並べます
  3. 全期間の総額を出す処理。月ごとの合計を足し上げます

第2章では、それぞれ空の入れ物を用意してから for でまわして詰めていました。1は辞書内包表記、2は set 内包表記と sorted、3はジェネレータ式と sum が、そのまま当てはまります。

リファクタリングで気をつけるのは、結果を変えないことです。手順としては、書き直す前の結果をひかえておき、書き直したあとに同じデータを流して見比べる、という進め方が安全です。今回はテストケースがその役割を果たします。

3つの結果は、別々に返すよりも1つの辞書にまとめたほうが、レポート側から使いやすくなります。キーの名前は中身がわかるものにしてください。呼び出す側は、キーを見るだけで何が入っているか判断できるようになります。

書き終えたら、行数がどれだけ減ったかを数えてみてください。短くなること自体が目的ではありませんが、処理の意図が1行で読み取れるようになったかどうかは、良いリファクタリングかを判断する目安になります。

要件

  1. monthly_total は辞書内包表記で作り、月をキー、その月の金額の合計を値にすること
  2. categories は set 内包表記で重複を落とし、sorted でリストにすること
  3. grand_total は sum とジェネレータ式で求めた整数にすること
  4. for 文と append による組み立てを残さないこと

入出力例

summarize({"2026-06":[{"amount":3200,"category":"食費","name":"スーパー"},{"amount":480,"category":"交通費","name":"電車代"}],"2026-07":[{"amount":620,"category":"食費","name":"コンビニ"},{"amount":2800,"category":"教養費","name":"書籍"}]}){"categories":["交通費","教養費","食費"],"grand_total":7100,"monthly_total":{"2026-06":3680,"2026-07":3420}} summarize({"2026-08":[{"amount":2100,"category":"食費","name":"スーパー"},{"amount":540,"category":"食費","name":"パン屋"},{"amount":220,"category":"交通費","name":"バス代"}]}){"categories":["交通費","食費"],"grand_total":2860,"monthly_total":{"2026-08":2860}}

ヒント

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

メモ

つくる 集計のリファクタ

⌘S で保存