Counterでグループ集計

このレッスンでできるようになることは、同じ値が何回出てきたかを Counter で一発で数え、いちばん多いものを取り出すことです。

金額の合計は defaultdict で書けるようになりました。今度は「何件あったか」という回数の集計です。カテゴリ名を並べたリストがあれば、collections の Counter に渡すだけで数え上がります。

from collections import Counter categories = ["食費", "文房具", "食費", "交通費", "食費"] counter = Counter(categories) print(counter["食費"]) # 3 print(counter["美容費"]) # 0

Counter は辞書の仲間なので、キーで引けば回数が返ります。無いキーを引いても KeyError にならず 0 が返るところが便利です。

よく使うのが most_common です。回数の多い順に「値と回数の組」のリストを返します。

print(counter.most_common(1)) # [('食費', 3)] top, count = counter.most_common(1)[0]

引数の 1 は「上位いくつ返すか」です。中身はタプルなので、アンパックで名前と回数に分けられます。回数が同じものが並んだときは、先に出てきたほうが前に来ます。

最後に注意点です。Counter は辞書に似ていますが同じ型ではありません。集計結果を関数の戻り値にするときは dict(counter) で普通の辞書に直しておくと、受け取った側が扱いに迷いません。defaultdict のときと同じ約束です。

家計簿では「今月いちばん多かった支出カテゴリ」がすぐ出せるようになります。金額の合計とは違う切り口の情報なので、レポートに並べると使い勝手が上がります。

要件

  1. collections の Counter で件数を数えること
  2. 戻り値は counts と top と count の3つのキーを持つ辞書にすること
  3. counts は dict() に変換した普通の辞書にすること
  4. 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編集部
main.py
学習モード

メモ

Counterでグループ集計

⌘S で保存