Counterでグループ集計
このレッスンでできるようになることは、同じ値が何回出てきたかを Counter で一発で数え、いちばん多いものを取り出すことです。
金額の合計は defaultdict で書けるようになりました。今度は「何件あったか」という回数の集計です。カテゴリ名を並べたリストがあれば、collections の Counter に渡すだけで数え上がります。
from collections import Counter
categories = ["食費", "文房具", "食費", "交通費", "食費"]
counter = Counter(categories)
print(counter["食費"]) # 3
print(counter["美容費"]) # 0Counter は辞書の仲間なので、キーで引けば回数が返ります。無いキーを引いても KeyError にならず 0 が返るところが便利です。
よく使うのが most_common です。回数の多い順に「値と回数の組」のリストを返します。
print(counter.most_common(1)) # [('食費', 3)]
top, count = counter.most_common(1)[0]引数の 1 は「上位いくつ返すか」です。中身はタプルなので、アンパックで名前と回数に分けられます。回数が同じものが並んだときは、先に出てきたほうが前に来ます。
最後に注意点です。Counter は辞書に似ていますが同じ型ではありません。集計結果を関数の戻り値にするときは dict(counter) で普通の辞書に直しておくと、受け取った側が扱いに迷いません。defaultdict のときと同じ約束です。
家計簿では「今月いちばん多かった支出カテゴリ」がすぐ出せるようになります。金額の合計とは違う切り口の情報なので、レポートに並べると使い勝手が上がります。
要件
- collections の Counter で件数を数えること
- 戻り値は counts と top と count の3つのキーを持つ辞書にすること
- counts は dict() に変換した普通の辞書にすること
- top と count は most_common で取り出すこと
入出力例
category_report([["ノート",250,"文房具"],["弁当",680,"食費"],["コーヒー",420,"食費"]]) → {"count":2,"counts":{"文房具":1,"食費":2},"top":"食費"}
category_report([["電車代",320,"交通費"],["バス代",210,"交通費"],["定食",900,"食費"],["回数券",3000,"交通費"]]) → {"count":3,"counts":{"交通費":3,"食費":1},"top":"交通費"}ヒント
編集 LuaGate編集部