Set Python. Множества в Python
Основы
В языке Python есть тип данных, который может быть очень полезен для работы с множествами – это set. В данном уроке будет рассказано о том, как работать с множествами (set python) и об операциях над ними.
Что это
Set в Python — это тип данных, встроенный в язык и предназначенный для работы с последовательностями, которые имеют свойства математических множеств. В качестве элементов набора данных выступают различные неизменяемые объекты. В python множество может состоять из не ограниченного количества элементов и они могут быть любых неизменяемых типов, таких как кортежи, числа, строки и т. д. Однако, множество не поддерживает mutable элементы, к примеру списки, словари, и прочие. Python множества — это изменяемые коллекции элементов, обладающие некоторыми особенностями:
— их элементы не упорядочены;
— их элементы не повторяются.
Таким образом, множеством в языке Python является неупорядоченная совокупность элементов, при том уникальных. Порядок расстановки элементов не учитывается при работе с его содержимым. Над одним или несколькими множествами можно выполнять разные операции, используя функции, содержащиеся в стандартной библиотеке Python.
Как создать множество python
Перед тем как выполнять операции с множеством, необходимо его создать. Существует несколько способов создавать множества в Python. Можно это сделать, присвоив любой переменной коллекцию значений, окружив их фигурными скобками <>, а так же разделить все элементы запятыми.
Python и теория множеств
В Python есть очень полезный тип данных для работы с множествами – это set. Об этом типе данных, примерах использования, и небольшой выдержке из теории множеств пойдёт речь далее.
Следует сразу сделать оговорку, что эта статья ни в коем случае не претендует на какую-либо математическую строгость и полноту, скорее это попытка доступно продемонстрировать примеры использования множеств в языке программирования Python.
Множество
Множество – это математический объект, являющийся набором, совокупностью, собранием каких-либо объектов, которые называются элементами этого множества. Или другими словами:
Что значит неупорядоченная? Это значит, что два множества эквивалентны, если содержат одинаковые элементы.
Элементы множества должны быть уникальными, множество не может содержать одинаковых элементов. Добавление элементов, которые уже есть в множестве, не изменяет это множество.
Множества, состоящие из конечного числа элементов, называются конечными, а остальные множества – бесконечными. Конечное множество, как следует из названия, можно задать перечислением его элементов. Так как темой этой статьи является практическое использование множеств в Python, то я предлагаю сосредоточиться на конечных множествах.
Множества в Python
Множество в Python можно создать несколькими способами. Самый простой – это задать множество перечислением его элементов в фигурных скобках:
Единственное ограничение, что таким образом нельзя создать пустое множество. Вместо этого будет создан пустой словарь:
Для создания пустого множества нужно непосредственно использовать set() :
Также в set() можно передать какой-либо объект, по которому можно проитерироваться (Iterable):
Ещё одна возможность создания множества – это использование set comprehension. Это специальная синтаксическая конструкция языка, которую иногда называют абстракцией множества по аналогии с list comprehension (Списковое включение).
Хешируемые объекты
Существует ограничение, что элементами множества (как и ключами словарей) в Python могут быть только так называемые хешируемые (Hashable) объекты. Это обусловлено тем фактом, что внутренняя реализация set основана на хеш-таблицах. Например, списки и словари – это изменяемые объекты, которые не могут быть элементами множеств. Большинство неизменяемых типов в Python (int, float, str, bool, и т.д.) – хешируемые. Неизменяемые коллекции, например tuple, являются хешируемыми, если хешируемы все их элементы.
Объекты пользовательских классов являются хешируемыми по умолчанию. Но практического смысла чаще всего в этом мало из-за того, что сравнение таких объектов выполняется по их адресу в памяти, т.е. невозможно создать два «равных» объекта.
Скорее всего мы предполагаем, что объекты City(«Moscow») должны быть равными, и следовательно в множестве cities должен находиться один объект.
Этого можно добиться, если определить семантику равенства для объектов класса City :
Чтобы протокол хеширования работал без явных и неявных логических ошибок, должны выполняться следующие условия:
- Хеш объекта не должен изменяться, пока этот объект существует
- Равные объекты должны возвращать одинаковый хеш
Свойства множеств
Тип set в Python является подтипом Collection (про коллекции), из данного факта есть три важных следствия:
- Определена операция проверки принадлежности элемента множеству
- Можно получить количество элементов в множестве
- Множества являются iterable-объектами
Принадлежность множеству
Проверить принадлежит ли какой-либо объект множеству можно с помощью оператора in . Это один из самых распространённых вариантов использования множеств. Такая операция выполняется в среднем за O(1) с теми же оговорками, которые существуют для хеш-таблиц.
Мощность множества
Мощность множества – это характеристика множества, которая для конечных множеств просто означает количество элементов в данном множестве. Для бесконечных множеств всё несколько сложнее.
Перебор элементов множества
Как уже было отмечено выше, множества поддерживают протокол итераторов, таким образом любое множество можно использовать там, где ожидается iterable-объект.
Отношения между множествами
Между множествами существуют несколько видов отношений, или другими словами взаимосвязей. Давайте рассмотрим возможные отношения между множествами в этом разделе.
Равные множества
Тут всё довольно просто – два множества называются равными, если они состоят из одних и тех же элементов. Как следует из определения множества, порядок этих элементов не важен.
Непересекающиеся множества
Если два множества не имеют общих элементов, то говорят, что эти множества не пересекаются. Или другими словами, пересечение этих множеств является пустым множеством.
Подмножество и надмножество
Подмножество множества S – это такое множество, каждый элемент которого является также и элементом множества S. Множество S в свою очередь является надмножеством исходного множества.
Пустое множество является подмножеством абсолютно любого множества.
Само множество является подмножеством самого себя.
Операции над множествами
Рассмотрим основные операции, опредяляемые над множествами.
Объединение множеств
Объединение множеств – это множество, которое содержит все элементы исходных множеств. В Python есть несколько способов объединить множества, давайте рассмотрим их на примерах.
Добавление элементов в множество
Добавление элементов в множество можно рассматривать как частный случай объединения множеств за тем исключением, что добавление элементов изменяет исходное множество, а не создает новый объект. Добавление одного элемента в множество работает за O(1) .
Пересечение множеств
Пересечение множеств – это множество, в котором находятся только те элементы, которые принадлежат исходным множествам одновременно.
При использовании оператора & необходимо, чтобы оба операнда были объектами типа set . Метод intersection , в свою очередь, принимает любой iterable-объект. Если необходимо изменить исходное множество, а не возращать новое, то можно использовать метод intersection_update , который работает подобно методу intersection , но изменяет исходный объект-множество.
Разность множеств
Разность двух множеств – это множество, в которое входят все элементы первого множества, не входящие во второе множество.
Удаление элементов из множества
Удаление элемента из множества можно рассматривать как частный случай разности, где удаляемый элемент – это одноэлементное множество. Следует отметить, что удаление элемента, как и в аналогичном случае с добавлением элементов, изменяет исходное множество. Удаление одного элемента из множества имеет вычислительную сложность O(1) .
Также у множеств есть метод differenсe_update , который принимает iterable-объект и удаляет из исходного множества все элементы iterable-объекта. Этот метод работает аналогично методу difference , но изменяет исходное множество, а не возвращает новое.
Симметрическая разность множеств
Симметрическая разность множеств – это множество, включающее все элементы исходных множеств, не принадлежащие одновременно обоим исходным множествам. Также симметрическую разность можно рассматривать как разность между объединением и пересечением исходных множеств.
Как видно из примера выше, число 0 принадлежит обоим исходным множествам, и поэтому оно не входит в результирующее множество. Для операции симметрической разности, помимо оператора ^ , также существует два специальных метода – symmetric_difference и symmetric_difference_update . Оба этих метода принимают iterable-объект в качестве аргумента, отличие же состоит в том, что symmetric_difference возвращает новый объект-множество, в то время как symmetric_difference_update изменяет исходное множество.
Заключение
Я надеюсь, мне удалось показать, что Python имеет очень удобные встроенные средства для работы с множествами. На практике это часто позволяет сократить количество кода, сделать его выразительнее и легче для восприятия, а следовательно и более поддерживаемым. Я буду рад, если у вас есть какие-либо конструктивные замечания и дополнения.
Как создать множество в питоне
Множество в языке Питон — это структура данных, эквивалентная множествам в математике. Множество может состоять из различных элементов, порядок элементов в множестве неопределен. В множество можно добавлять и удалять элементы, можно перебирать элементы множества, можно выполнять операции над множествами (объединение, пересечение, разность). Можно проверять принадлежность элемента множеству.
В отличие от массивов, где элементы хранятся в виде последовательного списка, в множествах порядок хранения элементов неопределен (более того, элементы множества хранятся не подряд, как в списке, а при помощи хитрых алгоритмов). Это позволяет выполнять операции типа “проверить принадлежность элемента множеству” быстрее, чем просто перебирая все элементы множества.
Элементами множества может быть любой неизменяемый тип данных: числа, строки, кортежи. Изменяемые типы данных не могут быть элементами множества, в частности, нельзя сделать элементом множества список (но можно сделать кортеж) или другое множество. Требование неизменяемости элементов множества накладывается особенностями представления множества в памяти компьютера.
Задание множеств
Множество задается перечислением всех его элементов в фигурных скобках. Исключением явлеется пустое множество, которое можно создать при помощи функции set() . Если функции set передать в качестве параметра список, строку или кортеж, то она вернёт множество, составленное из элементов списка, строки, кортежа. Например:
Каждый элемент может входить в множество только один раз, порядок задания элементов неважен. Например, программа:
выведет True , так как A и B — равные множества.
Каждый элемент может входить в множество только один раз. set(‘Hello’) вернет множество из четырех элементов: <'H', 'e', 'l', 'o'>.
Работа с элементами множеств
Узнать число элементов в множестве можно при помощи функции len .
Перебрать все элементы множества (в неопределенном порядке!) можно при помощи цикла for :
Проверить, принадлежит ли элемент множеству можно при помощи операции in , возвращающей значение типа bool . Аналогично есть противоположная операция not in . Для добавления элемента в множество есть метод add :
Для удаления элемента x из множества есть два метода: discard и remove . Их поведение различается только в случае, когда удаляемый элемент отсутствует в множестве. В этом случае метод discard не делает ничего, а метод remove генерирует исключение KeyError .
Наконец, метод pop удаляет из множества один случайный элемент и возвращает его значение. Если же множество пусто, то генерируется исключение KeyError .
Python set() наборы и множества
Set Python — это неупорядоченный и неиндексированный набор элементов.
- Каждый элемент уникален.
- В наборе есть неупорядоченные элементы.
- Дубликаты не допускаются.
- Сам набор является изменяемым, т.е. из него можно добавлять / удалять элементы (элементы).
- В отличие от массивов, в которых элементы хранятся по порядку, порядок элементов в наборе не определен.
- Элементы в наборе не сохраняются в порядке их появления в наборе.
Создание set в Python
Набор можно создать, поместив все элементы в фигурные скобки <>, разделенные запятыми. Их также можно создать с помощью встроенной функции set() .
Элементы могут относиться к разным типам данных, но Set не поддерживает изменяемые элементы. Наборы неупорядочены, поэтому нельзя быть уверенным в том, в каком порядке они появятся.
Пример
Доступ к элементам
Поскольку наборы являются неупорядоченными и неиндексированными, нельзя получить доступ к элементам, ссылаясь на их индекс, в отличие от массивов.
Доступ к элементам set можно получить одним из следующих способов:
- Повторите цикл набора элементов с помощью цикла for .
- Проверьте, присутствует ли указанное значение в наборе, используя ключевое слово in .
mango
cherry
apple
False
True
Добавить элементы в набор
Мы можем добавлять элементы в набор, используя функцию add() . В случае, если нам нужно добавить больше элементов, нам нужно использовать для этого метод update() .
Удаление элементов из набора
Мы можем удалить элементы из набора, используя любой из следующих методов:
- С помощью метода remove().
- discard().
- clear() – удаляет все элементы из набора.
- del() – удаляет весь набор.
Использование метода remove()
Использование метода discard()
Метод clear()
Метод del()
Методы в наборах
Метод | Описание |
---|---|
add() | Добавляет элемент в набор |
clear() | Удаляем все элементы |
copy() | Возвращает копию набора |
difference() | Возвращает набор, содержащий разницу между двумя или более наборами |
difference_update() | Удаляет элементы из этого набора, которые также включены в другой, указанный |
discard() | Удалить указанный элемент |
intersection() | Возвращает множество, то есть пересечение двух других |
intersection_update() | Удаляет элементы в этом наборе, которые отсутствуют в других указанных |
isdisjoint() | Возвращает, имеют ли два набора пересечение или нет |
issubset() | Возвращает, содержит ли другой набор этот набор или нет |
issuperset() | Возвращает, содержит ли этот набор другой набор или нет |
pop() | Удаляет элемент |
remove() | Удаляем указанный элемент |
symmetric_difference() | Возвращает множество с симметричными разностями двух множеств |
symmetric_difference_update() | вставляет симметричные отличия из этого набора и другого |
union() | Возвращает набор, содержащий объединение множеств |
update() | Обновляет набор с помощью объединения этого набора и других |
Наборы используются для выполнения математических операций набора функций, таких как объединение, разность, пересечение и симметричное различие.
Set Union — включение всех элементов из обоих наборов
Операция объединения выполняется одним из следующих методов:
- Используя | оператор
- Используя метод union()
Пример союз множеств
Пересечение набора — включение элементов, общих для обоих наборов
Операция пересечения выполняется одним из следующих методов:
- Используя & оператор
- Используя метод intersection()
Пересечение множеств
Set Difference — включение элементов из любого из наборов.
(A — B) содержит элементы, которые есть только в множестве A, но не в множестве B.
(B — A) содержит элементы, которые есть только в множестве B, но не в множестве A.