33. Отношения между множествами и операции над ними
Оглавление урока
В уроке 8.2. мы познакомились с методами множеств в Python. В этом уроке более подробно разберемся с отношениями между множествами и операциями над ними в Python.
Отношения между множествами
Равные множества
Какие множества называются равными? Множества равны, если они состоят из одинаковых элементов:
s_1 = {1, 2, 3}
s_2 = {1, 3, 2}
print(s_1 == s_2) # => True

Непересекающиеся множества
Два множества не пересекаются, если они не имеют общих элементов. Чтобы определить пересечение множеств можно использовать метод intersection()
, где в круглых скобках указываются через запятую множества, пересечения которых необходимо найти:
s_1 = {1, 4}
s_2 = {3, 4}
s_3 = {4}
print(s_1.intersection(s_2, s_3)) # => {4}
Если множества не пересекаются, то метод вернет пустое множество:
s_1 = {1, 2}
s_2 = {3, 4}
print(s_1.intersection(s_2)) # => set()

Еще лучше определять пересекаются множества или нет при помощи метода isdisjoint()
, которые возвращают истину, если оба множества не имеют общих элементов.
s_1 = {1, 2}
s_2 = {3, 4}
print(s_1.isdisjoint(s_2)) # => True
Подмножество и надмножество
Если все элементы одного множества присутствуют в другом множестве, то первое называется подмножество, а второе надмножество. Методы issubset()
и issuperset()
проверяют, является ли множество (для которого вызывается метод) подмножеством или надмножеством, соответственно.
s_1 = {1, 2}
s_2 = {1, 2, 3}
print(s_1.issubset(s_2)) # => True
print(s_1.issuperset(s_2)) # => False
print(s_2.issuperset(s_1)) # => True
Если вам не нравятся эти методы, то подмножество можно найти, например, так:
print(s_1.intersection(s_2) == s_1) # => True
Пустое множество является подмножеством любого множества. Так же множество является подмножеством самого себя.
Что-то получилось слишком много слов «множества», что и сам запутался, поэтому давайте просто взглянем на картинку ниже, и все встанет на свои места.

Теперь перейдем к операциям над множествами, по которым кратко пробежались в уроке 8.1. и немного в этом уроке (метод intersection()
).
Операции над множествами
Объединение множеств
Объединить два множества в Python можно несколькими способами: использовать оператор «вертикальная черта» (|
) или «пайп», как бы назвали ее пользователи UNIX, или использовать метод union()
.
s_1 = {1, 2, 4}
s_2 = {1, 2, 3}
print(s_1 | s_2) # => {1, 2, 3, 4}
print(s_1.union(s_2)) # => {1, 2, 3, 4}

Чтобы объединить два множества и не возвращать новое множество, используйте метод update()
, который изменяет исходное.
Пересечение множеств
Множество из элементов, которые есть в обоих множествах, называется пересечением. Найти пересечение множеств можно так же несколькими способами: используя оператор «амперсанд» (&
) или метод intersection()
:
s_1 = {1, 2, 4}
s_2 = {1, 2, 3}
print(s_1 & s_2) # => {1, 2}
print(s_1.intersection(s_2)) # => {1, 2}

Так же есть метод intersection_update()
, который работает точно так же, как и intersection()
, только не возвращает новое множество, а изменяет текущее.
Разность множеств
Под разностью множеств понимается набор элементов, которые есть в первом, но нет во втором множестве. Для этого есть оператор «минус» (-
) и метод difference()
.
s_1 = {1, 2, 4}
s_2 = {1, 2, 3}
print(s_1 - s_2) # => {4}
print(s_1.difference(s_2)) # => {4}

Аналогично, для разности множеств есть метод differenсe_update()
, который изменяет множество, а не возвращает новое, как метод differenсe()
.
Симметрическая разность множеств
Набор из элементов одного множества, которых нет во втором и элементов второго множества, которых нет в первом. Получить симметрическую разность можно при помощи оператора (^
) или метода symmetric_difference()
:
s_1 = {1, 2, 4}
s_2 = {1, 2, 3}
print(s_1 ^ s_2) # => {3, 4}
print(s_1.symmetric_difference(s_2)) # => {3, 4}

Думаю, вы уже догадались, что есть метод symmetric_difference_update()
.
Стоит добавить, что методы union()
, intersection()
и difference()
(и их аналоги) могут работать сразу с несколькими множествами, т.е. больше чем с двумя:
s_1 = {1, 2, 4}
s_2 = {1, 2, 3}
s_3 = {4, 5, 1}
print(s_1 | s_2 | s_3) # => {1, 2, 3, 4, 5}
print(s_1.union(s_2, s_3)) # => {1, 2, 3, 4, 5}
Структура frozenset
Множество можно сделать неизменяемым. Для этих целей есть структура frozenset
, о которой ранее ничего не говорили.
fs = frozenset([1, 2, 4])
fs.add(3) # => AttributeError: 'frozenset' object has no attribute 'add'
Если попробовать добавить элемент в frozenset
, то возникнет исключение AttributeError
. Об исключениях и как их обрабатывать поговорим в уроке 10.5.
В этом уроке достаточно подробно разобрались с отношениями между множествами и тем, какие операции над ними можно выполнять.