つくる 月別データ構造

このレッスンでできるようになることは、第2章で覚えた道具だけで、平らな支出リストを月別構造に作り直して月次レポートを出すことです。

新しい文法は出てきません。今まで書いてきた部品を1本につなぎます。中級の学習で大事なのは、動いているコードをより良い形に作り直すリファクタリングです。今回はデータの持ち方そのものを変えます。

手順は次のとおりです。まず1件の支出を (品名, 金額, カテゴリ, 日付) のタプルで表します。記録したら中身が変わらないデータなので、リストではなくタプルにします。次に defaultdict(list) を使って、日付の先頭7文字をキーにした月別の辞書へ振り分けます。最後に月ごとに、件数と合計金額と最も件数の多いカテゴリを Counter で求めて1行にまとめます。

表示する行の形は次のとおりです。

2026-07 件数3 合計1350円 最多カテゴリ食費(2件)

月の並びは sorted で昇順に固定します。辞書のキーをそのまま回すと、データを足した順に表示が変わってしまいます。同じデータを何度処理しても同じ結果になることは、レポートの最低条件です。

関数を2つに分けるところも見ておいてください。振り分けを担当する build_by_month と、表示を担当する report です。データを作る処理と見せる処理を分けておくと、第3章で集計の書き方を内包表記に変えるときも、表示側に手を入れずに済みます。第1章でファイルを責務で分けたのと同じ考え方を、今度は関数の単位でやっています。

要件

  1. build_by_month は日付の先頭7文字をキーにした辞書を返すこと。defaultdict を使い、返すときは dict() に変換すること
  2. report は sorted で月を昇順に回すこと
  3. 各行は 2026-07 件数3 合計1350円 最多カテゴリ食費(2件) の形式にすること
  4. 最多カテゴリは Counter の most_common で求めること

入出力例

出力: "2026-07 件数3 合計1350最多カテゴリ食費(2) 2026-08 件数4 合計1640最多カテゴリ食費(2)"

ヒント

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

メモ

つくる 月別データ構造

⌘S で保存