つくる:カテゴリ別集計
無いキーを読むと、そこで止まる
第 6 章の summarize は全体の合計まででした。使ってみると、次にほしくなるのは決まって「何にいくら使ったのか」です。カテゴリごとの合計が出て、はじめて家計簿は役に立ちます。
作るのは、キーがカテゴリ名、値がそのカテゴリの合計金額という辞書です。
Python
{"食費": 300, "日用品": 200}カテゴリの数は最初から決まっていないので、リストではなく辞書で持ちます。空の辞書から始めて、記録を 1 件ずつ足し込んでいく形になります。
ここで最初につまずくのが、まだ 1 度も出てきていないカテゴリです。
Python
totals = {"食費": 300}
print(totals["娯楽"])KeyError で止まります。無いキーを読んだときの Python の答えは「そんなものは無い」であって、0 ではありません。足し込む前に、そのキーがすでにあるかどうかを確かめる必要があります。
確かめ方は 2 つあります。
Python
print("娯楽" in totals)
print(totals.get("娯楽", 0))False と 0 が出ます。in はキーがあるかどうかを返し、get は値を取りに行って、無ければ第 2 引数に書いた既定値を返します。どちらを使っても構いません。
in の意味が入れ物によって変わることも押さえておきます。リストでは値の有無、辞書では キー の有無です。辞書の値のほうは見てくれないので、値を探しているつもりで見つからないときはここを疑います。
出てこなかったカテゴリは、キーごと入れない
仕様として決めておくことが 1 つあります。使わなかったカテゴリを 0 で入れるか、入れないかです。
このアプリでは 入れません。食費しか使っていない月に {"食費": 300, "娯楽": 0, "交通費": 0} が返ってきても、読むときに邪魔なだけだからです。支出が 1 件も無ければ、空の辞書 {} を返します。
どちらが正しいかではなく、どちらが使いやすいかで選びます。決めたら本文とテストで揺らさないことのほうが大事です。
できあがる辞書のキーは「最初に出てきた順」に並びます。ただし辞書どうしを比べるとき Python はキーの並びを見ないので、{"a": 1, "b": 2} と {"b": 2, "a": 1} は等しいと判定されます。並びを気にせず書けます。
値は最後まで int のまま持ちます。途中で str にすると "120" + "180" が "120180" になり、金額として使えなくなります。文字列にするのは画面に出すときだけです。
やってみよう
関数 total_by_category(records) を実装してください。支出の辞書が並んだリストを受け取り、キーがカテゴリ名、値がそのカテゴリの合計金額 (int) の辞書を return します。
登場しなかったカテゴリはキーに含めません。空リストを渡されたときは空の辞書 {} を返します。同じカテゴリが何件あっても、1 つのキーにまとめて足し込んでください。
要件
- 関数名は total_by_category で、引数は records の1つ
- キーがカテゴリ名、値がそのカテゴリの合計金額(int)の辞書を return する
- 登場しなかったカテゴリはキーに含めない
- 空リストを渡されたときは空の辞書 {} を返す