>[('spam', 3)]
Счетчики можно объединять. Для начала снова взглянем на содержимое breakfast_counter:
>>>> breakfast_counter
>>>> Counter({'spam': 3, 'eggs': 1})
Теперь мы создадим новый список, который называется lunch, и счетчик, который называется lunch_counter:
>>>> lunch = ['eggs', 'eggs', 'bacon']
>>>> lunch_counter = Counter(lunch)
>>>> lunch_counter
>Counter({'eggs': 2, 'bacon': 1})
Счетчики можно объединить с помощью оператора +:
>>>> breakfast_counter + lunch_counter
>Counter({'spam': 3, 'eggs': 3, 'bacon': 1})
Как вы можете догадаться, счетчики можно вычитать друг из друга с помощью оператора —. Что мы будем есть на завтрак, но не на обед?
>>>> breakfast_counter — lunch_counter
>Counter({'spam': 3})
О’кей, теперь узнаем, что мы можем съесть на обед, но не можем на завтрак:
>>>> lunch_counter — breakfast_counter
>Counter({'bacon': 1, 'eggs': 1})
По аналогии с множествами, показанными в главе 4, вы можете получить общие элементы с помощью оператора пересечения &:
>>>> breakfast_counter & lunch_counter
>Counter({'eggs': 1})
В результате пересечения был получен общий элемент ('eggs') с низким значением счетчика. Это имеет смысл: на завтрак у нас было только одно яйцо, поэтому указанное количество является общим.
Наконец, вы можете получить все элементы с помощью оператора объединения |:
>>>> breakfast_counter | lunch_counter
>Counter({'spam': 3, 'eggs': 2, 'bacon': 1})
Элемент 'eggs' снова оказался общим для обоих счетчиков. В отличие от сложения объединение не складывает счетчики, а выбирает тот, который имеет наибольшее значение.
Упорядочиваем по ключу с помощью OrderedDict()
Многие примеры кода, показанные в первых главах этой книги, демонстрируют, что порядок ключей в словаре нельзя предсказать: вы можете добавить в определенном порядке ключи a, b и c, но функция keys() вернет результат "c, a, b". Рассмотрим модифицированный пример из главы 1:
>>>> quotes = {
>…·····'Moe': 'A wise guy, huh?',
>…·····'Larry': 'Ow!',
>…·····'Curly': 'Nyuk nyuk!',
>…·····}
>>>> for stooge in quotes:
>…··print(stooge)
>…
>Larry
>Curly
>Moe
Словарь OrderedDict() запоминает порядок, в котором добавлялись ключи, и возвращает их в том же порядке с помощью итератора. Попробуем создать OrderedDict из последовательности кортежей вида «ключ — значение»:
>>>> from collections import OrderedDict
>>>> quotes = OrderedDict([
>…·····('Moe', 'A wise guy, huh?'),
>…·····('Larry', 'Ow!'),
>…·····('Curly', 'Nyuk nyuk!'),
>…·····])
>>>>
>>>> for stooge in quotes:
>…·····print(stooge)
>…
>Moe
>Larry
>Curly