defaultdictで集計
このレッスンでできるようになることは、初期化を書かずにカテゴリ別の集計を組み立てることです。
前のレッスンの get と setdefault でも集計は書けますが、キーが無いときの値を毎回書き並べるのは少し冗長です。collections モジュールの defaultdict を使うと、その「無かったときの値」を辞書を作るときに一度決めておけます。
from collections import defaultdict
totals = defaultdict(int)
totals["食費"] += 680
totals["食費"] += 420
print(totals["食費"]) # 1100defaultdict(int) に渡しているのは int という関数そのものです。無いキーが読まれた瞬間に int() が呼ばれて 0 が入り、そこに足し込まれます。リストをためたいときは defaultdict(list) と書けば、無いキーに空リストが入るので、いきなり append できます。
この仕組みには落とし穴が1つあります。読んだだけでキーが作られてしまう点です。
totals = defaultdict(int)
print(totals["交通費"]) # 0
print(dict(totals)) # {'交通費': 0}存在を確かめるつもりで角かっこを使うと、意図せずキーが増えてしまいます。読むだけのときは get を使いましょう。
もう1つ大事なのが、集計を終えたら dict(totals) で普通の辞書に戻す習慣です。defaultdict のまま外へ返すと、受け取った側が知らないうちにキーを増やしてしまいます。集計の途中は defaultdict、返すときは dict という流れを身に付けてください。
要件
- collections の defaultdict を使って集計すること
- 無いキーの初期値が 0 になるようにすること
- 戻り値は dict() で普通の辞書に変換したものにすること
入出力例
category_totals([["ノート",250,"文房具"],["弁当",680,"食費"],["コーヒー",420,"食費"]]) → {"文房具":250,"食費":1100}
category_totals([["定食",900,"食費"],["電車代",320,"交通費"],["バス代",210,"交通費"],["消しゴム",120,"文房具"]]) → {"交通費":530,"文房具":120,"食費":900}ヒント
編集 LuaGate編集部