Простой Python. Современный стиль программирования (Любанович) - страница 81

>[('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

Стек + очередь == deque

deque (произносится как «дэк») — это двухсторонняя очередь, которая имеет возможности стека и очереди. Она полезна, когда вы хотите добавить и удалить элементы с любого конца последовательности. В следующем примере мы будем двигаться с обоих концов слова к его середине, чтобы увидеть, является ли оно палиндромом. Функция popleft() удаляет крайний слева элемент deque и возвращает его, функция pop() удаляет крайний справа элемент и возвращает его. Вместе они двигаются с концов слова к его середине. Работа будет продолжаться до тех пор, пока крайние символы совпадают и пока не будет достигнута середина: