Множества в Python: вводный гайд для начинающих
Создаём свои уникальные коллекции в Python.
Иллюстрация: Оля Ежак для Skillbox Media
Продолжаем знакомиться со структурами данных в Python. Мы уже рассказывали вам о списках и кортежах. В этой статье поговорим о множествах. Посмотрим, для чего они нужны, как создаются и чем отличаются от других типов данных.
Навигация:
Алексей Ушаровский
Principal software engineer, эксперт Skillbox по бэкенду и Java в энтерпрайзе.
Что такое множество в Python
Множество (set) — это изменяемый набор уникальных и неупорядоченных элементов. Представьте, что вы пришли на пляж и собрали в пакет коллекцию ракушек — каждая ракушка отличается от другой и не имеет чётко обозначенного места в пакете. Такую коллекцию можно совершенно легитимно назвать множеством :)
Перечислим основные свойства множеств:
- Уникальность: каждый элемент множества неповторим. Если попробовать создать в наборе дубликат, Python не даст этого сделать.
- Неупорядоченность: у элементов множества нет порядкового номера.
- Изменяемость: можно добавлять во множество или удалять из него элементы.
Так как множества неупорядоченны, вы не сможете получить элемент по индексу, как в случае с кортежами и списками. Зато можно очень быстро проверить наличие элемента в коллекции: когда «ракушки» не пронумерованы, компьютеру не нужно рассматривать каждую по отдельности — можно посмотреть сразу всю коллекцию.
А ещё set используют, когда нужно очистить данные от дубликатов. Например, если вы спарсили с сайта список повторяющихся номеров телефонов, можно превратить его во множество — после этого все копии исчезнут.
Какие объекты можно добавить во множество
Множества могут содержать только неизменяемые объекты:
- целые числа (integer);
- числа с плавающей точкой (float);
- строки (string);
- кортежи (tuple).
Дело в том, что данные хранятся во множестве не в первозданном виде, а в виде хеша — то есть уникального битового массива. Так компьютеру проще искать элементы в коллекции. Однако, чтобы этот процесс работал, каждый элемент должен всегда выдавать одно и то же значение.
Именно поэтому объектами множества не могут быть списки (list), словари (dict), и другие типы данных, которые могут перезаписываться во время работы программы.
Читайте также:
Создание множеств
Их можно создавать по-разному.
Способ 1: с помощью фигурных скобок
Внутри скобок разместите элементы, которые надо включить в множество. Если вы поместите в скобки повторяющиеся элементы, ошибки не будет, но в коллекции дубликаты не сохранятся.
Важно: если не прописать аргументы в фигурных скобках, получится пустой словарь, а не пустое множество, как можно было бы предположить. Если же вам нужно именно пустое множество, используйте функцию set().
Способ 2: с помощью функции set()
Встроенная функция set() принимает один аргумент — итерируемый объект (список, кортеж, строку или другой объект) — и возвращает множество его элементов. Чтобы создать пустую коллекцию, используйте set() без аргументов.
Вот так создаются множества из списка:
А вот так — из строк:
Видно, что каждый символ строки становится объектом множества. Повторяющиеся символы при этом не добавляются.
Создание множества из кортежа:
Создание множества из диапазона (range):
Из числа множество создать не удастся — предварительно надо будет превратить его в строку с помощью функции str().
Если попробовать сделать множество из словаря, сохранятся только его ключи — значения в набор не войдут.
Способ 3: с помощью генератора
Быстрый и удобный способ создавать множества. Чтобы понять, в чём его прелесть, сравним создание множества с использованием генератора и с заполнением через цикл:
Видно, что синтаксис генератора гораздо лаконичнее. Использование этого способа улучшает читаемость кода и снижает вероятность ошибок при его поддержке.
Способ 4: создание замороженного множества (frozenset)
frozenset() — это неизменяемый вариант множества, то есть добавить в него или удалить из него элементы не выйдет. Создать его можно так:
Как добавить элементы во множество
Для добавления элементов можно использовать сразу три метода: add(), update(), union().
Метод add() добавляет во множество один объект.
Метод update() позволяет добавить сразу несколько элементов. Аргументом может быть список, строка или другой итерируемый объект.
Множества в Python можно объединять друг с другом — для этого используют метод union(). Если в двух наборах есть повторяющиеся объекты, в их «гибриде» останется только один.
Удаление элементов множества
Для удаления элементов множества используются встроенные методы remove (), discard(), clear() и pop(). Разберём каждый из них по очереди.
Метод remove() удаляет элемент из множества. Если такого элемента в наборе не окажется, интерпретатор выдаст исключение.
Метод discard() работает безопаснее — если элемент не найден, исключения не выпадет.
Метод pop() удаляет случайный компонент множества.
Если же вы хотите полностью очистить множество, используйте метод clear().
Операции над математическими множествами
Тип данных set поддерживает операции с математическими множествами: объединение, пересечение, разность и симметрическую разность.
Объединение множеств
Чтобы объединить несколько множеств в Python, используется уже знакомый нам метод union(), а также оператор |.
В результате получается новый набор, который содержит все уникальные элементы из каждого множества.
Пересечение множеств
Пересечение множеств в Python можно получить двумя способами: с помощью метода intersection() и с помощью оператора &. Оба возвращают новую коллекцию, содержащую только те элементы, что есть в двух исходных множествах. Если таковых не найдётся, получится пустая коллекция.
В примере выше множества set1 и set2 имеют общие объекты 3 и 4, поэтому результатом их пересечения будет {3, 4}.
Чтобы удалить из исходного множества несовпадающие элементы, используют метод intersection_update() или оператор &=.
Разность множеств
Разность — это набор элементов, которые принадлежат первому множеству, но не принадлежат второму. Другими словами, её можно представить как результат вычитания второго множества из первого.
Чтобы получить разность, используется метод difference() или оператор -.
Чтобы удалить из множества совпадающие элементы, используйте метод difference_update() или оператор -=.
Симметрическая разность множеств
Симметрическая разность — это набор элементов, которые принадлежат либо первому, либо второму множеству, но не их пересечению. Иными словами, симметрическая разность содержит все элементы обоих множеств, кроме общих.
В Python симметрическую разность можно найти с помощью метода symmetric_difference() или оператора ^.
Чтобы удалить из множества общие элементы, используйте метод symmetric_difference_update() или оператор ^=.
Как проверить наличие элементов во множествах
Чтобы проверить, есть ли элементы в наборе, можно использовать функции len() и bool().
Функция len() возвращает длину множества. Если длина равна 0, коллекция пустая.
Функция bool() возвращает False, если множество пустое, и True, если нет.
Сравнение множеств
Сравнивать множества можно с помощью операторов == (равенство)
и != (неравенство). Первый проверяет, есть ли в множествах общие объекты, а второй — есть ли различающиеся.
Для сравнения множеств также используются операторы >, >=, <, <=. О них мы расскажем ниже, когда будем рассматривать подмножества и надмножества.
Как проверить принадлежность элемента множеству
Для этого в Python используется оператор in. Он возвращает True, если элемент присутствует в коллекции, и False, если отсутствует.
Также можно использовать оператор not in, чтобы убедиться, что объект не принадлежит множеству.
Как проверить, является ли одно множество подмножеством другого
В Python есть инструменты и для этого: метод issubset(), а также операторы >, >=, < и <=.
Метод issubset() возвращает True, если все элементы одного множества присутствуют в другом, и False — если нет.
Получается, что в этом примере set1 — это подмножество set2, так как все элементы set1 присутствуют в set2. При этом set1 не является подмножеством set4, потому что в set1 есть один уникальный элемент.
Если оба множества равны (set1 = set3), метод issubset() возвращает True.
Другой способ — использовать операторы < (меньше) и <= (меньше или равно). Эти операторы проверяют, является ли «левое» множество подмножеством «правого». Если наборы идентичны, оператор < возвращает False, а оператор <= — True.
Напротив, чтобы проверить, является ли одно множество надмножеством другого, используются операторы >= (больше или равно) и > (больше). Если они идентичны, оператор > вернёт False, а оператор >= — True.
Что запомнить
Кратко подведём итоги статьи:
- Множество в Python — это изменяемая структура данных, которая содержит уникальные и неупорядоченные элементы. Множества полезны в случаях, когда нужно быстро проверить наличие элемента или удалить дубликаты из больших объёмов данных.
- Множества в Python могут содержать только неизменяемые типы данных — целые числа, строки и кортежи. Словари, списки и другие mutable-объекты не могут быть частью множества.
- Так как элементы множества неупорядоченны, вы не сможете получить доступ к ним по индексу — как, например, к элементам в списков и кортежей.
- Тип данных set поддерживает математические операции над множествами (например, объединение, пересечение, разность).
Больше интересного про код — в нашем телеграм-канале. Подписывайтесь!