defaultdictで集計

このレッスンでできるようになることは、初期化を書かずにカテゴリ別の集計を組み立てることです。

前のレッスンの get と setdefault でも集計は書けますが、キーが無いときの値を毎回書き並べるのは少し冗長です。collections モジュールの defaultdict を使うと、その「無かったときの値」を辞書を作るときに一度決めておけます。

from collections import defaultdict totals = defaultdict(int) totals["食費"] += 680 totals["食費"] += 420 print(totals["食費"]) # 1100

defaultdict(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 という流れを身に付けてください。

要件

  1. collections の defaultdict を使って集計すること
  2. 無いキーの初期値が 0 になるようにすること
  3. 戻り値は dict() で普通の辞書に変換したものにすること

入出力例

category_totals([["ノート",250,"文房具"],["弁当",680,"食費"],["コーヒー",420,"食費"]]){"文房具":250,"食費":1100} category_totals([["定食",900,"食費"],["電車代",320,"交通費"],["バス代",210,"交通費"],["消しゴム",120,"文房具"]]){"交通費":530,"文房具":120,"食費":900}

ヒント

生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア
編集 LuaGate編集部
main.py
学習モード

メモ

defaultdictで集計

⌘S で保存