Преобразование других типов данных с помощью функции 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():