Python. Посчитать количество объектов каждого типа

Допустим, вы пишете программу, которая обрабатывает заявки разных типов — идеи, вопросы и проблемы:

from collections import namedtuple
Request = namedtuple("Request", ("type", "text"))

requests = [
  Request(type="question", text="Как пасти котов?"),
  Request(type="problem", text="Бакланы портят стадион"),
  Request(type="idea", text="Переводчик с лисьего на русский"),
  Request(type="problem", text="Кот крадёт электричество"),
  Request(type="problem", text="Мыши похитили 540 кг марихуаны"),
  Request(type="idea", text="Холодильник с таймером"),
]

Предположим, требуется посчитать количество заявок каждого типа. Если в прошлой жизни человек писал на джаваскрипте, код может получиться таким:

stats = {}
for req in requests:
  if req.type in stats:
    stats[req.type] += 1
  else:
    stats[req.type] = 1

stats
{'question': 1, 'problem': 3, 'idea': 2}

Прямо больно смотреть на этот if, верно? Лучше воспользоваться методом dict.setdefault(). Но как по мне, он тоже уродливый, поэтому ещё лучше — collections.defaultdict:

from collections import defaultdict
stats = defaultdict(lambda: 0)
for req in requests:
    stats[req.type] += 1

dict(stats)
{'question': 1, 'problem': 3, 'idea': 2}

А совсем хорошо — collections.Counter:

from collections import Counter
stats = Counter(req.type for req in requests)

dict(stats)
{'question': 1, 'problem': 3, 'idea': 2}

У счётчиков есть ещё пара полезных особенностей, но о них в другой раз.

★ Подписывайтесь на новые заметки.