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

>…·····if contents & {'vermouth', 'orange juice'}:

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

>…

>screwdriver

>martini

>manhattan

Результатом работы оператора & является множество, содержащее все элементы, которые находятся в обоих сравниваемых списках. Если ни один из заданных ингредиентов не содержится в предлагаемых коктейлях, оператор & вернет пустое множество. Этот результат можно считать равным False.

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

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

>…·····if 'vodka' in contents and not contents & {'vermouth', 'cream'}:

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

>…

>screwdriver

>black russian

Сохраним множества ингредиентов для этих двух напитков в переменных, чтобы нам не пришлось набирать много текста в дальнейших примерах:

>>>> bruss = drinks['black russian']

>>>> wruss = drinks['white russian']

В следующих примерах демонстрируется использование операторов множеств. В одних из них демонстрируется применение особой пунктуации, в других — особых функций, в третьих — и того и другого. Мы будем использовать тестовые множества а (содержит элементы 1 и 2) и b (содержит элементы 2 и 3):

>>>> a = {1, 2}

>>>> b = {2, 3}

Пересечение множеств (члены обоих множеств) можно получить с помощью особого пунктуационного символа & или функции множества intersection(), как показано здесь:

>>>> a & b

>{2}

>>>> a.intersection(b)

>{2}

В этом фрагменте используются сохраненные нами переменные:

>>>> bruss & wruss

>{'kahlua', 'vodka'}

В этом примере мы получаем объединение (члены обоих множеств), используя оператор | или функцию множества union():

>>>> a | b

>{1, 2, 3}

>>>> a.union(b)

>{1, 2, 3}

Алкогольная версия:

>>>> bruss | wruss

>{'cream', 'kahlua', 'vodka'}

Разность множеств (члены только первого множества, но не второго) можно получить с помощью символа — или функции difference():

>>>> a — b

>{1}

>>>> a.difference(b)

>{1}

>>>> bruss — wruss

>set()

>>>> wruss — bruss

>{'cream'}

Самыми распространенными операциями с множествами являются объединение, пересечение и разность. Для полноты картины я включил в этот раздел и остальные операции, но вы, возможно, никогда не будете их использовать.

Для выполнения исключающего ИЛИ (элементы или первого, или второго множества, но не общие) используйте оператор ^ или функцию symmetric_difference():

>>>> a ^ b

>{1, 3}

>>>> a.symmetric_difference(b)

>{1, 3}

В этом примере определяется эксклюзивный ингредиент для русских напитков:

>>>> bruss ^ wruss

>{'cream'}

Вы можете проверить, является ли одно множество подмножеством другого (все члены первого множества являются членами второго), с помощью оператора <= или функции issubset():