Если видео недоступно для просмотра, попробуйте выключить блокировщик рекламы.

Создавать и модифицировать множества вы уже научились. Но если этим ограничиться, то может показаться, что множества не сильно-то и отличаются от списков — да, они позволяют быстрее проверить вхождение элемента, но зато не поддерживают механизм срезов. Так вот, наибольшую пользу приносят именно богатство и мощь средств по сопоставлению множеств!

Проверка на равенство

Давайте проверим два множества на равенство:

>>> set([1, 2, 3, 2, 1]) == {3, 1, 2}
True

Вы могли бы подумать, что два множества равны, если каждый отдельный элемент одного множества содержится и во втором, и ваша догадка была бы близка к истине. Но вспомним, что коллекции в Python хранят только ссылки на объекты. Так что же, множества равны, если ссылаются на одни и те же объекты? Одинаковые ссылки "равны" — это правда. Но могут быть и равны разные объекты!

Дело в том, что в Python есть специальный протокол проверки на равенство. Большинство встроенных типов данных поддерживает этот протокол. Мы можем проверять на равенство числа, строки, булевы значения. А ещё можем приравнивать кортежи, списки, словари. И вот тут Python поступает очень разумно: если вы приравняете две коллекции одного типа, то эти коллекции будут считаться равными, если их элементы попарно равны (с точки зрения протокола, опять же). Посмотрите:

>>> [1, 2, ["foo", "bar"]] == [1, 2, ["foo"] + ["bar"]]
True
>>> (1, True, []) == (1, True, [])
True
>>> {"a": 1, "b": 2} == {"b": 2, "a": 1}
True

Словари равны, если порядок ключей разный — лишь бы были равны значения по соответствующим ключам и сами наборы ключей были одинаковыми!

Вот и множества равны, если содержат одинаковые наборы равных попарно элементов.

Объединение множеств

Множества в Python, по аналогии с множествами в математике, поддерживают операцию объединения (union). Эта операция не объединяет множества, как могло бы показаться, но возвращает такое множество — новый объект — которое содержит все элементы, содержащиеся хотя бы в одном из оригинальных множеств. По смыслу объединение похоже на операцию "ИЛИ" из булевой логики: элемент будет присутствовать в объединении, если он присутствует в первом исходном множестве ИЛИ во втором. Для объединения множеств в Python используется оператор |:

>>> visited_by_masha = {'Paris', 'London'}
>>> visited_by_kolya = {'Moscow', 'Paris'}
>>> visited_by_kolya | visited_by_masha
{'London', 'Moscow', 'Paris'}

set union

Пересечение множеств

Раз есть операция, похожая на "ИЛИ", то логично было бы предположить, что есть и "операция И" ("Ы"?). Да, есть и такая — пересечение (intersection) множеств. В пересечение входят элементы, присутствующие в первом из оригинальных множеств И во втором. Оператор пересечения — &. Пример:

>>> visited_by_masha = {'Paris', 'London'}
>>> visited_by_kolya = {'Moscow', 'Paris'}
>>> visited_by_kolya & visited_by_masha
{'Paris'}

set intersection

Разность множеств

Разность (difference) множеств — такое множество, элементы которого содержатся в первом оригинальном множестве, но не содержатся во втором. Разность представлена оператором - (уж очень смысл похож на вычитание из арифметики). Пример:

>>> visited_by_masha = {'Paris', 'London'}
>>> visited_by_kolya = {'Moscow', 'Paris'}
>>> visited_by_masha - visited_by_kolya
{'London'}
>>> visited_by_kolya - visited_by_masha
{'Moscow'}
a - b b - a

Симметрическая разность

Симметрическая разность (symmetric difference) — множество, в которое входят элементы, присутствующие ЛИБО в первом, ЛИБО во втором оригинальном множестве. По смыслу операция похожа на исключающее ИЛИ (xor), поэтому и представлена оператором ^. Пример:

>>> visited_by_masha = {'Paris', 'London'}
>>> visited_by_kolya = {'Moscow', 'Paris'}
>>> visited_by_kolya ^ visited_by_masha
{'London', 'Moscow'}

set symmetrical difference

Подмножества и надмножества

Одно множество является подмножеством (subset) другого, если все элементы первого входят во второе, но второе может содержать ещё и другие элементы. Второе в этом случае является надмножеством (superset) для первого. Такое соотношение множеств можно проверить с помощью методов issubset и issuperset:

>>> a = {1, 2, 3, 4}
>>> b = {3, 4}
>>> b.issubset(a)
True
>>> a.issuperset(b)
True

set inclusion

Забавный факт: равные множества являются друг для друга одновременно и подмножествами и надмножествами.

Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Node, PHP, Python и Java.

Хекслет

Подробнее о том, почему наше обучение работает →