ジェネレータ式
このレッスンでできるようになること。ジェネレータ式で合計を求め、途中のリストを作らずに集計できるようになります。
ここまでの3レッスンは、いずれも新しい入れ物を作る書き方でした。ところが合計を出したいだけのとき、金額を並べたリストは合計を出した瞬間に用がなくなります。
total = sum([e["amount"] for e in expenses])この角かっこを外すと、ジェネレータ式になります。
total = sum(e["amount"] for e in expenses)ジェネレータ式は、値を全部作ってから渡すのではなく、必要になったときに1件ずつ作って渡すしくみです。リストを丸ごとメモリに置かずに済むので、支出が何万件になっても使うメモリはほとんど増えません。関数の引数がジェネレータ式ひとつだけのときは、上のように丸かっこを省いて書けます。
代わりに気をつける点があります。ジェネレータ式は1回しか読み取れません。変数に入れて sum を2回呼ぶと、2回目は0になります。また、len で件数を数えることもできません。中身を何度も使うなら、素直にリスト内包表記にしてください。
gen = (e["amount"] for e in expenses)
first = sum(gen) # ここで中身を使い切る
second = sum(gen) # 0 になる合計以外にも、min や max、any や all といった「まとめて1つの答えを出す関数」とは相性がよく、同じ書き方がそのまま使えます。第4章の高階関数でも、この形は何度も出てきます。
月別の辞書からカテゴリを絞って合計するときは、for を2つ並べて末尾に if を置きます。1行が長くなりすぎるようなら、途中で改行して読みやすく整えてください。
要件
- 角かっこのリストを作らず、sum にジェネレータ式を渡すこと
- 全ての月を対象にし、指定カテゴリだけを合計すること
- 該当が無いときは 0 を返すこと
入出力例
total_of({"2026-06":[{"amount":3200,"category":"食費","name":"スーパー"},{"amount":480,"category":"交通費","name":"電車代"}],"2026-07":[{"amount":620,"category":"食費","name":"コンビニ"},{"amount":2800,"category":"教養費","name":"書籍"}]}, "食費") → 3820
total_of({"2026-06":[{"amount":3200,"category":"食費","name":"スーパー"},{"amount":480,"category":"交通費","name":"電車代"}],"2026-07":[{"amount":220,"category":"交通費","name":"バス代"}]}, "交通費") → 700ヒント
編集 LuaGate編集部