ネスト構造
このレッスンでできるようになることは、月から支出リストへたどれる入れ子のデータを組み立て、その構造を走査して集計することです。
ここまで支出は1本の平らなリストで持っていました。件数が増えてくると「7月の支出だけ見たい」と思うたびに全件をなめることになります。月ごとに小分けにしておけば、必要な月をキーで一発で取り出せます。
目指す形は次のとおりです。外側が辞書で、キーが月、値がその月の支出のリストです。
by_month = {
"2026-07": [("ノート", 250, "文房具"), ("弁当", 680, "食費")],
"2026-08": [("定食", 900, "食費")],
}辞書の中にリスト、リストの中にタプルという三段重ねです。組み立てには setdefault が効きます。日付が "2026-07-03" の文字列なら、先頭7文字を切り出せばそのまま月のキーになります。
month = date[:7]
by_month.setdefault(month, []).append((name, price, category))走査するときは for を二重にします。外側で月を回し、内側でその月の支出を回します。このとき外側は for month in sorted(by_month): と書いてください。辞書のキーをそのまま回すと登録した順になり、データの入り方で並びが変わってしまいます。sorted を通せば月の昇順に固定できます。
入れ子は深くしすぎると読みにくくなりますが、二段までなら見通しは十分保てます。この形が第3章以降の内包表記や高階関数の土台になります。
要件
- 日付の先頭7文字を月のキーにすること
- いったん月から支出リストへの入れ子の辞書を作ってから集計すること
- 戻り値は月をキーにし、値を total と names の2つのキーを持つ辞書にすること
- 月は sorted で昇順に処理すること
入出力例
monthly_summary([["ノート",250,"文房具","2026-07-03"],["弁当",680,"食費","2026-07-05"],["定食",900,"食費","2026-08-02"]]) → {"2026-07":{"names":["ノート","弁当"],"total":930},"2026-08":{"names":["定食"],"total":900}}
monthly_summary([["電車代",320,"交通費","2026-09-01"],["バス代",210,"交通費","2026-09-11"]]) → {"2026-09":{"names":["電車代","バス代"],"total":530}}ヒント
編集 LuaGate編集部