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

Преобразование других типов данных с помощью функции set()

Вы можете создать множество из списка, строки, кортежа или словаря, потеряв все повторяющиеся значения.

Для начала взглянем на строку, которая содержит более чем одно включение некоторых букв:

>>>> set('letters')

>{'l', 'e', 't', 'r', 's'}

Обратите внимание на то, что множество содержит только одно включение букв «e» или «t», несмотря на то, что в слове letters по два включения каждой из них.

Создадим множество из списка:

>>>> set(['Dasher', 'Dancer', 'Prancer', 'Mason-Dixon'])

>{'Dancer', 'Dasher', 'Prancer', 'Mason-Dixon'}

А теперь из кортежа:

>>>> set(('Ummagumma', 'Echoes', 'Atom Heart Mother'))

>{'Ummagumma', 'Atom Heart Mother', 'Echoes'}

Когда вы передаете функции set() словарь, она возвращает только ключи:

>>>> set({'apple': 'red', 'orange': 'orange', 'cherry': 'red'})

>{'apple', 'cherry', 'orange'}

Проверяем на наличие значения с помощью ключевого слова in

Такое использование множеств самое распространенное. Мы создадим словарь, который называется drinks. Каждый ключ будет названием коктейля, а соответствующие значения — множествами ингредиентов:

>>>> drinks = {

>…·····'martini': {'vodka', 'vermouth'},

>…·····'black russian': {'vodka', 'kahlua'},

>…·····'white russian': {'cream', 'kahlua', 'vodka'},

>…·····'manhattan': {'rye', 'vermouth', 'bitters'},

>…·····'screwdriver': {'orange juice', 'vodka'}

>…·····}

Несмотря на то что и словарь, и множества окружены фигурными скобками ({ и }), множество — это всего лишь последовательность значений, а словарь — это набор пар «ключ — значение».

Какой из коктейлей содержит в себе водку? (Обратите внимание на то, что для выполнения этих проверок я заранее демонстрирую использование ключевых слов for, if, and и or, которые будут рассмотрены только в следующей главе.)

>>>> for name, contents in drinks.items():

>…·····if 'vodka' in contents:

>…·········print(name)

>…

>screwdriver

>martini

>black russian

>white russian

Мы хотим выпить коктейль с водкой, но не переносим лактозу, а вермут на вкус напоминает керосин:

>>>> for name, contents in drinks.items():

>…·····if 'vodka' in contents and not ('vermouth' in contents or

>…·········'cream' in contents):

>…·········print(name)

>…

>screwdriver

>black russian

Перепишем этот пример чуть более сжато в следующем разделе.

Комбинации и операторы

Что, если вам нужно проверить наличие сразу нескольких значений множества? Предположим, вы хотите найти любой напиток, содержащий апельсиновый сок или вермут. Для этого мы используем оператор пересечения множеств (&):

>>>> for name, contents in drinks.items():