... food_counter[food] += 1
...
>>> for food, count in food_counter.items():
... print(food, count)
150
Глава 5. Py Boxes: модули, пакеты и программы
...
eggs 1
spam 3
В предыдущем примере, если бы food_counter был обычным словарем, а не
defaultdict, Python генерировал бы исключение всякий раз, когда бы мы пытались
увеличить элемент словаря food_counter[food], поскольку он был бы не инициали-
зирован. Нам понадобилось бы сделать дополнительную работу, как показано здесь:
>>> dict_counter = {}
>>> for food in ['spam', 'spam', 'eggs', 'spam']:
... if not food in dict_counter:
... dict_counter[food] = 0
... dict_counter[food] += 1
...
>>> for food, count in dict_counter.items():
... print(food, count)
...
spam 3
eggs 1
Подсчитываем элементы
с помощью функции Counter()
Если говорить о счетчиках, то в стандартной библиотеке имеется счетчик, который
решает задачу, показанную в предыдущем примере, и даже больше:
>>> from collections import Counter
>>> breakfast = ['spam', 'spam', 'eggs', 'spam']
>>> breakfast_counter = Counter(breakfast)
>>> breakfast_counter
Counter({'spam': 3, 'eggs': 1})
Функция most_common() возвращает все элементы в убывающем порядке или
лишь те элементы, количество которых больше, чем заданный аргумент count:
>>> breakfast_counter.most_common()
[('spam', 3), ('eggs', 1)]
>>> breakfast_counter.most_common(1)
[('spam', 3)]
Счетчики можно объединять. Для начала снова взглянем на содержимое
breakfast_counter:
>>> breakfast_counter
>>> Counter({'spam': 3, 'eggs': 1})
Стандартная библиотека Python
151
Теперь мы создадим новый список, который называется lunch, и счетчик, кото-
рый называется lunch_counter:
>>> lunch = ['eggs', 'eggs', 'bacon']
>>> lunch_counter = Counter(lunch)