Операции со статистикойВернёмся к нашему примеру со статистикой по заявкам разных типов. Вот данные за три дня:
monday = {"question": 1, "problem": 3, "idea": 2}
tuesday = {"problem": 5, "idea": 1}
wednesday = {"question": 2, "problem": 2}
Как бы посчитать агрегированную статистику? Можно так, конечно:
def add_day(day_stats, stats):
for key, value in day_stats.items():
stats[key] += value
return stats
stats = {"question": 0, "problem": 0, "idea": 0}
stats = add_day(monday, stats)
stats = add_day(tuesday, stats)
stats = add_day(wednesday, stats)
stats
{'question': 3, 'problem': 10, 'idea': 3}
Но вы наверняка догадываетесь, что это не наш метод. Поможет арифметика со счётчиками:
from collections import Counter
monday = Counter(monday)
tuesday = Counter(tuesday)
wednesday = Counter(wednesday)
stats = monday + tuesday + wednesday
stats
Counter({'problem': 10, 'question': 3, 'idea': 3})
Что насчёт самого популярного типа заявок?
stats.most_common(1)
[('problem', 10)]
А какие типы заявок встречались во вторник и в среду?
(tuesday | wednesday).keys()
dict_keys(['problem', 'idea', 'question'])
А сколько проблем было за все дни, кроме понедельника?
(stats - monday)["problem"]
7
Думаю, вы уловили идею ツ
P.S. Хотите реально злую штуку? Вот как посчитать агрегированную статистику в одну строчку:
sum(map(Counter, [monday, tuesday, wednesday]), Counter())
Ставьте 😮, если хотите подробный разбор этого однострочника (а также узнать, почему от него вздыхает Гвидо). Или ставьте 😎, если и так всё понятно.