getとsetdefault
このレッスンでできるようになることは、まだ登録されていないカテゴリが来ても落ちない集計を書くことです。
辞書に無いキーを角かっこで読むと KeyError が出てプログラムが止まります。家計簿でカテゴリ別の合計を出すとき、初めて出てきたカテゴリでいきなり落ちてしまうのは困ります。入門では if category in totals: と書いて場合分けしていましたが、辞書には同じことをもっと短く書くメソッドが2つ用意されています。
1つ目が get です。キーが無いときに返す値を第2引数で決められます。
totals = {"食費": 1100}
print(totals.get("食費", 0)) # 1100
print(totals.get("交通費", 0)) # 0これを使うと、合計の足し込みが1行になります。totals[category] = totals.get(category, 0) + price と書けば、初回は 0 に足され、2回目以降は既存の合計に足されます。get は辞書を読むだけで、書き込みはしません。
2つ目が setdefault です。キーが無いときは指定した値を入れてから、その値を返します。値がリストのときに便利です。
names = {}
names.setdefault("食費", []).append("弁当")
names.setdefault("食費", []).append("コーヒー")
print(names) # {'食費': ['弁当', 'コーヒー']}1行目でリストが無いので空リストが入り、そこに追加されます。2行目はすでにリストがあるので、第2引数は使われず既存のリストが返ってきます。だからそのまま append できます。
使い分けの目安は次のとおりです。読むだけで辞書を汚したくないときは get、キーごとの入れ物を用意しながら育てたいときは setdefault です。
要件
- 戻り値は totals と names の2つのキーを持つ辞書にすること
- totals はカテゴリ名から合計金額への辞書にすること
- names はカテゴリ名から品名リストへの辞書にし、出てきた順に並べること
- if でキーの有無を調べず、get と setdefault を使うこと
入出力例
summarize([["ノート",250,"文房具"],["弁当",680,"食費"],["コーヒー",420,"食費"]]) → {"names":{"文房具":["ノート"],"食費":["弁当","コーヒー"]},"totals":{"文房具":250,"食費":1100}}
summarize([["電車代",320,"交通費"]]) → {"names":{"交通費":["電車代"]},"totals":{"交通費":320}}
summarize([]) → {"names":{},"totals":{}}ヒント
編集 LuaGate編集部