Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос нашим менторам. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.
Об обучении на Хекслете

Операции над множествами

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

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

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

>>> 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'}

set difference a minus b set difference b minus 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

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


<span class="translation_missing" title="translation missing: ru.web.courses.lessons.mentors.mentor_avatars">Mentor Avatars</span>

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят менторы из команды Хекслета или другие студенты.

Для полного доступа к курсу, нужна профессиональная подписка

Профессиональная подписка откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, даст возможность обращаться за помощью к менторам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
115
курсов
892
упражнения
2241
час теории
3196
тестов

Зарегистрироваться

или войти в аккаунт

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 115 курсов, 2000+ часов теории
  • 800 практических заданий в браузере
  • 250 000 студентов

Нажимая кнопку «Зарегистрироваться», вы даёте своё согласие на обработку персональных данных в соответствии с «Политикой конфиденциальности» и соглашаетесь с «Условиями оказания услуг».

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Rambler
Логотип компании Bookmate
Логотип компании Botmother

Есть вопрос или хотите участвовать в обсуждении?

Зарегистрируйтесь или войдите в свой аккаунт

Нажимая кнопку «Зарегистрироваться», вы даёте своё согласие на обработку персональных данных в соответствии с «Политикой конфиденциальности» и соглашаетесь с «Условиями оказания услуг».