Предположим, вы хотите объединить два множества, которые содержат несколько общих ключей. Поскольку множество должно содержать только уникальные значения, объединение двух множеств будет содержать лишь одно включение каждого ключа. Пустое множество — это множество, содержащее ноль элементов. Основываясь на рис. 3.1, можно сказать, что пустым будет множество, которое содержит женские имена, начинающиеся с буквы «Х».
Рис. 3.1. Распространенные операции с множествами
Создание множества с помощью функции set()
Чтобы создать множество, вам следует использовать функцию set() или разместить в фигурных скобках одно или несколько разделенных запятыми значений, как показано здесь:
>>> empty_set = set()
>>> empty_set
set()
>>> even_numbers = {0, 2, 4, 6, 8}
>>> even_numbers
{0, 8, 2, 4, 6}
>>> odd_numbers = {1, 3, 5, 7, 9}
>>> odd_numbers
{9, 3, 1, 5, 7}
Как и в случае со словарем, порядок ключей в множестве не имеет значения.
Поскольку пустые квадратные скобки [] создают пустой список, вы могли бы рассчитывать на то, что пустые фигурные скобки {} создают пустое множество. Вместо этого пустые фигурные скобки создают пустой словарь. Именно поэтому интерпретатор выводит пустое множество как set() вместо {}. Почему так происходит? Словари появились в Python раньше и успели захватить фигурные скобки в свое распоряжение.
Преобразование других типов данных с помощью функции 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():
…·····if contents & {'vermouth', 'orange juice'}: