Множества в Python – это один из самых интересных компонентов данного языка. Это такая модель, в которую входят неструктурированные элементы, которые при этом не имеют индексов. Аналогично спискам, множества дают возможность вносить элементы и удалять их. Тем не менее есть некоторые особенности, определяющие и отделяющие множество от похожих типов данных.
Прежде всего, это такие моменты:
- Множества не содержат дубликатов.
- Составляющие множества неизменные по своей природе. Тем не менее сам по себе объект, принадлежащий к этому типу данных, является изменяемым объектом.
- Поскольку составляющие множеств не имеют собственных индексов, во множества не встроены операции, связанные с обращением к индексу или нескольким индексам (то бишь, к срезу).
Сегодня мы поговорим о различных операциях, которые можно осуществлять с множествами в Python.
Как создавать множества с помощью Python?
Вообще, множества создаются несколькими методами. Например, можно передать все составляющие внутрь фигурных скобок, а все элементы разделить запятыми. Множество включает какое-угодно число элементов, которые бывают различных типов. То есть, нет разницы, вы будете использовать в фигурных скобках целочисленные значения, строки, кортежи. Все эти типы данных будут поддерживаться.
Правда, здесь есть исключения. Множества не поддерживают изменяемые типы элементов, такие как списки, словари, и так далее.
Давайте рассмотрим один вариант создания множества средствами языка Python.
num_set = {1, 2, 3, 4, 5, 6} print(num_set)
Результат получаем такой:
{1, 2, 3, 4, 5, 6}
Только что нами было создано первое множество, которое полностью состоит из целочисленных значений.
А теперь давайте попробуем создать множество из строковых значений.
string_set = {"Nicholas", "Michelle", "John", "Mercy"} print(string_set)
Результат получаем следующий:
{‘Michelle’, ‘Nicholas’, ‘John’, ‘Mercy’}
Возможно, вы обратили внимание на то, что элементы в выдаче выше располагаются в другой последовательности. Все потому, что элементы не упорядочиваются и находятся в произвольном порядке. Если вы выполните аналогичный код повторно, возможно, вы получите выдачу с объектами, которые каждый раз будут находиться в другом порядке.
Также можно создать множество с элементами, относящимся к разным типам. Например.
mixed_set = {2.0, "Nicholas", (1, 2, 3)} print(mixed_set)
Если попробовать выполнить этот код, то получаем это множество значений.
{2.0, ‘Nicholas’, (1, 2, 3)}
Обратите внимание, что все элементы в этом объекте относятся к различным типам данных.
Также возможно создание множества из списков. Это делается, в том числе, путем вызова встроенной функции Python под названием set(), Например.
num_set = set([1, 2, 3, 4, 5, 6]) print(num_set)
Результат:
{1, 2, 3, 4, 5, 6}
Как мы уже говорили ранее. множества не включают дубликатов. Допустим, мы в множество передадим список с дубликатами элементов.
num_set = set([1, 2, 3, 1, 2]) print(num_set)
Попробуем выполнить этот код.
{1, 2, 3}
Как видим, множество полностью убрало все дубликаты и выдало лишь по одному экземпляру элементов. Это случается, если генерировать множества с нуля. Например, так.
num_set = {1, 2, 3, 1, 2} print(num_set)
Результат мы получаем следующий.
{1, 2, 3}
Обратите внимание, что здесь также были удалены дубликаты. Необходимо учитывать этот момент при разработке приложений на Python.
Множество может быть и пустым. Правда, определяться этот тип данных будет, как словарь. В этом можно убедиться, если вы введете следующий код и выполните его.
x = {} print(type(x))
Результат.
<class ‘dict’>
Как показано в выдаче, тип переменной x – словарь.
Для создания пустого множества в Python, необходимо использовать функцию set() без передачи какого-либо значения в параметрах. В общем, смотрите на пример.
x = set() print(type(x))
Результат получается таким.
<class ‘set’>
Видим, что приложение нам сигнализирует о том, что переменная x хранит множество.
Доступ к элементам множеств
У Python нет непосредственного метода получения значения отдельных элементов множества. Тем не менее у нас есть возможность использовать цикл для того, чтобы пройтись по всем элементам. Например, так.
months = set(["Jan", "Feb", "March", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec"]) for m in months: print(m)
Результат после выполнения этого кода будет следующим.
March
Feb
Dec
Jan
May
Nov
Oct
Apr
June
Aug
Sep
July
Также можно проверить наличие элемента во множество с помощью in, как показано ниже.
months = set(["Jan", "Feb", "March", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec"]) print("May" in months)
Выполним фрагмент кода, который содержит данный оператор:
True
Почему было возвращено значение True? Дело в том, что элемент был найден во множестве, и этот факт подтвердил оператор in. Соответственно, если пытаться найти элемент, который отсутствует во множестве, будет получено значение False.
months = set(["Jan", "Feb", "March", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec"]) print("Nicholas" in months) # False
Если выполнить этот код, то увидим, что будет возвращено значение False.
Добавление элементов во множество
Python – это язык программирования, который позволяет вносить новые элементы во множество с помощью функции add(). Пример кода.
months = set(["Jan", "March", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec"]) months.add("Feb") print(months)
Результат:
{‘Oct’, ‘Dec’, ‘Feb’, ‘July’, ‘May’, ‘Jan’, ‘June’, ‘March’, ‘Sep’, ‘Aug’, ‘Nov’, ‘Apr’}
Элемент Feb успешно внесен во множество. Если это было множество чисел, мы не можем передавать новый элемент внутри скобок, как это делается для строк. Например.
num_set = {1, 2, 3} num_set.add(4) print(num_set)
Результат:
{1, 2, 3, 4}
А теперь поговорим о том, как удалять элементы из множеств.
Как удалять элементы из множеств?
Python имеет функционал, позволяющий удалять элементы из множеств. Правда, поскольку элементы не индексируются, делается это по-другому по сравнению с другими итерируемыми объектами. Для этого можно использовать один из методов discard() или remove().
Учтите то, что discard() не выдает ошибку, если элемент не будет найден во множестве. А вот если попробовать удалить несуществующий элемент с помощью метода remove(), то будет возвращена ошибка. В этом отличия между данными методами.
Вот, как это работает на практике.
num_set = {1, 2, 3, 4, 5, 6} num_set.discard(3) print(num_set)
Результат:
{1, 2, 4, 5, 6}
Как видим, после использования функции discard() элемент 3 был удален из множества.
Аналогично, приведем пример использования метода remove().
num_set = {1, 2, 3, 4, 5, 6} num_set.remove(3) print(num_set)
Результат:
{1, 2, 4, 5, 6}
Теперь попробуем удалить элемент, который отсутствует во множестве. Для начала используем метод discard().
num_set = {1, 2, 3, 4, 5, 6} num_set.discard(7) print(num_set)
Если выполнить этот код, получим такой результат:
{1, 2, 3, 4, 5, 6}
А теперь давайте попробуем выполнить аналогичное действие с помощью метода remove().
num_set = {1, 2, 3, 4, 5, 6} num_set.remove(7) print(num_set)
В результате, мы получаем следующее значение.
Traceback (most recent call last): File "C:\Users\admin\sets.py", line 2, in <module> num_set.remove(7) KeyError: 7
В выдаче мы видим, что была возвращена ошибка KeyError, которая означает проблемы при удалении элемента, отсутствующего во множестве.
С помощью метода pop(), мы можем удалить и вернуть элемент. Поскольку элементы располагаются в произвольном порядке, мы не можем заранее узнать, какой элемент будет удален.
num_set = {1, 2, 3, 4, 5, 6} print(num_set.pop())
В нашем случае было удалено значение 1. Но с такой же вероятностью могли бы быть удалены цифры 2, 3, 4, и так далее.
Этот же метод может использоваться для того, чтобы возвращать оставшиеся во множестве элементы. Но синтаксис в этом случае будет несколько отличаться. Посмотрите на этот фрагмент кода.
num_set = {1, 2, 3, 4, 5, 6} num_set.pop() print(num_set)
Результат:
{2, 3, 4, 5, 6}
Это те элементы, которые остались во множестве после того, как была удалена цифра 1 из него.
Также есть метод clear(), который позволяет удалить все элементы, которые есть во множестве. Например:
num_set = {1, 2, 3, 4, 5, 6} num_set.clear() print(num_set)
В качестве результата служит пустой set(), в котором не содержится никаких элементов.
Объединение множеств
Также Python предусматривает возможность объединять множества. Допустим, есть два множества: A, B. После того, как они будут объединены, появится еще одно множество, которое будет содержать значения из каждого.
Делается это с помощью функции union().
months_a = set(["Jan", "Feb", "March", "Apr", "May", "June"]) months_b = set(["July", "Aug", "Sep", "Oct", "Nov", "Dec"]) all_months = months_a.union(months_b) print(all_months)
Результат:
{‘Oct’, ‘Jan’, ‘Nov’, ‘May’, ‘Aug’, ‘Feb’, ‘Sep’, ‘March’, ‘Apr’, ‘Dec’, ‘June’, ‘July’}
Объединение может состоять из более чем двух множеств, и все элементы складываются в одно большое. Например:
x = {1, 2, 3} y = {4, 5, 6} z = {7, 8, 9} output = x.union(y, z) print(output)
Результат:
{1, 2, 3, 4, 5, 6, 7, 8, 9}
Если попробовать объединить множества, дубликаты также будут проигнорированы. Не забываем, что множества не поддерживают дубликаты.
x = {1, 2, 3} y = {4, 3, 6} z = {7, 4, 9} output = x.union(y, z) print(output)
Результат выполнения этого фрагмента кода.
{1, 2, 3, 4, 6, 7, 9}
Оператор | может также задействоваться, если надо найти объединение двух либо более множеств. Например:
months_a = set(["Jan","Feb", "March", "Apr", "May", "June"]) months_b = set(["July", "Aug", "Sep", "Oct", "Nov", "Dec"]) print(months_a | months_b)
Результат:
{‘Feb’, ‘Apr’, ‘Sep’, ‘Dec’, ‘Nov’, ‘June’, ‘May’, ‘Oct’, ‘Jan’, ‘July’, ‘March’, ‘Aug’}
Если вам необходимо создать объединение из более, чем двух множеств, их названия могут быть разделены с использованием оператора |. Вот так:
x = {1, 2, 3} y = {4, 3, 6} z = {7, 4, 9} print(x | y | z)
После того, как мы выполним этот код, получим следующий результат.
{1, 2, 3, 4, 6, 7, 9}
Пересечение множеств
Допустим, у вас есть два множества: A и B. Их пересечение представляет собой множество элементов, которые для A и B являются общими.
Операция пересечения во множествах может выполняться как с использованием оператора &, так и с использованием метода intersection(). Давайте рассмотрим пример:
x = {1, 2, 3} y = {4, 3, 6} print(x & y) # Результат: 3
В каждом из множеств 3 – это общий элемент. Аналогичный результат может быть получен, если используется метод intersection():
x = {1, 2, 3} y = {4, 3, 6} z = x.intersection(y) print(z) # Результат: 3
Разница между множествами
Допустим, у вас есть два множества: A и B. И вам надо получить разницу между ними. Что подразумевается под ней? Разница между множествами A и B – это такое множество, в котором содержатся все элементы, которые есть в A, но при этом их нет в B. Следовательно, B – A – это наоборот.
Чтобы определять разницу между множествами в Python, используется как функция difference(), так и оператор – .
Приведем пример:
set_a = {1, 2, 3, 4, 5} set_b = {4, 5, 6, 7, 8} diff_set = set_a.difference(set_b) print(diff_set)
Результат:
{1, 2, 3}
В приведенном выше примере кода, лишь первые три элемента множества set_a отсутствуют во множестве set_b, формируя нашу выдачу.
Как было сказано ранее, для нахождения разницы между множествами также можно использовать оператор –.
set_a = {1, 2, 3, 4, 5} set_b = {4, 5, 6, 7, 8} print(set_a - set_b)
Результат:
{1, 2, 3}
Симметричная разница – это что?
Под симметричной разницей между множествами A и B подразумевается такое множество, в котором содержатся элементы, которые есть и в A, и в B, помимо тех, которые есть в каждом из этих множеств.
Чтобы создать симметричную разницу, необходимо воспользоваться оператором ^ или функцией symmetric_difference().
set_a = {1, 2, 3, 4, 5} set_b = {4, 5, 6, 7, 8} symm_diff = set_a.symmetric_difference(set_b) print(symm_diff)
Результат:
{1, 2, 3, 6, 7, 8}
Симметричную разницу можно также найти следующим образом:
set_a = {1, 2, 3, 4, 5} set_b = {4, 5, 6, 7, 8} print(set_a ^ set_b)
Результат:
{1, 2, 3, 6, 7, 8}