Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Операции над множествами Python: Словари и Множества

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

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

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

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

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


Аватары экспертов Хекслета

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

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

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

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

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

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

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

Об обучении на Хекслете

Для полного доступа к курсу нужен базовый план

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

Получить доступ
900
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

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

  • 130 курсов, 2000+ часов теории
  • 900 практических заданий в браузере
  • 360 000 студентов
Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»

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

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Python-разработчик
Профессия
Разработка веб-приложений на Django
25 мая 10 месяцев

Используйте Хекслет по максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

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

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