つくる 月別データ構造
このレッスンでできるようになることは、第2章で覚えた道具だけで、平らな支出リストを月別構造に作り直して月次レポートを出すことです。
新しい文法は出てきません。今まで書いてきた部品を1本につなぎます。中級の学習で大事なのは、動いているコードをより良い形に作り直すリファクタリングです。今回はデータの持ち方そのものを変えます。
手順は次のとおりです。まず1件の支出を (品名, 金額, カテゴリ, 日付) のタプルで表します。記録したら中身が変わらないデータなので、リストではなくタプルにします。次に defaultdict(list) を使って、日付の先頭7文字をキーにした月別の辞書へ振り分けます。最後に月ごとに、件数と合計金額と最も件数の多いカテゴリを Counter で求めて1行にまとめます。
表示する行の形は次のとおりです。
2026-07 件数3 合計1350円 最多カテゴリ食費(2件)月の並びは sorted で昇順に固定します。辞書のキーをそのまま回すと、データを足した順に表示が変わってしまいます。同じデータを何度処理しても同じ結果になることは、レポートの最低条件です。
関数を2つに分けるところも見ておいてください。振り分けを担当する build_by_month と、表示を担当する report です。データを作る処理と見せる処理を分けておくと、第3章で集計の書き方を内包表記に変えるときも、表示側に手を入れずに済みます。第1章でファイルを責務で分けたのと同じ考え方を、今度は関数の単位でやっています。
要件
- build_by_month は日付の先頭7文字をキーにした辞書を返すこと。defaultdict を使い、返すときは dict() に変換すること
- report は sorted で月を昇順に回すこと
- 各行は
2026-07 件数3 合計1350円 最多カテゴリ食費(2件)の形式にすること - 最多カテゴリは Counter の most_common で求めること
入出力例
出力: "2026-07 件数3 合計1350円 最多カテゴリ食費(2件)
2026-08 件数4 合計1640円 最多カテゴリ食費(2件)"ヒント
編集 LuaGate編集部