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}
У счётчиков есть ещё пара полезных особенностей, но о них в другой раз.
★ Подписывайтесь на новые заметки.