Если вы новичок в Python, то, скорее всего, уже сталкивались со списками. Однако слышали ли вы про множества в Python?
В этой статье мы рассмотрим, что такое множества, как их создавать и какие операции с ними можно совершать.
Что такое множества в Python?
В Python множества очень похожи на списки, за исключением того факта, что их элементы неизменяемы. Это означает, что вы не можете изменять элементы уже объявленного множества. Но добавлять и удалять элементы из множества можно.
Другими словами, множество – это изменяемая неупорядоченная группа элементов, в которой сами элементы неизменяемы.
Другой особенностью множества является то, что оно может включать в себя элементы разных типов. Это означает, что у вас в одном множестве могут быть числа, строки и и даже кортежи !
[python_ad_block]Как создать множество
Наиболее распространенный способ создания множества в Python – использование встроенной функции set().
first_set = set(("Connor", 32, (1, 2, 3)))
first_set
# {32, 'Connor', (1, 2, 3)}
second_set = set("Connor")
second_set
# {'n', 'C', 'r', 'o'}
Вы также можете создавать множества, используя синтаксис фигурных скобок {}:
third_set = {"Apples", ("Bananas", "Oranges")}
type(third_set)
# <class 'set'>
Функция set() принимает итерируемый объект и возвращает список объектов, которые будут вставлены в множество. При помощи синтаксиса {} в множество вставляются объекты, взятые в фигурные скобки.
Независимо от способа создания множества каждый его элемент должен быть неизменяемым объектом. Поэтому, если вы добавите список в множество, то столкнетесь с ошибкой, ведь списки изменяемы:
incorrect_set = {"Apples", ["Bananas", "Oranges"]}
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# TypeError: unhashable type: 'list'
Как добавить или удалить элемент из множества
Мы уже знаем, что множества можно менять. Это означает, что вы можете добавлять и удалять элементы, которые принадлежат множеству.
Вот пример добавления элементов в множество с помощью функции update().
add_set = set((1, 2, 3, 4))
add_set
# {1, 2, 3, 4}
add_set.update((1,))
add_set
# {1, 2, 3, 4}
add_set.update(("cello", "violin"))
add_set
# {1, 2, 3, 4, 'violin', 'cello'}
Но обратите внимание: если мы попытаемся добавить в множество cello — элемент, который уже есть в множестве, — ничего не поменяется:
add_set.update(("cello",))
add_Set
# {1, 2, 3, 4, 'violin', 'cello'}
Это связано с тем, что множества в Python не могут содержать дубликатов. Итак, когда мы попытались добавить еще одну строку cello в множество, Python понял, что мы пытаемся добавить повторяющийся элемент, и не обновил набор. Это одно из ключевых отличий множества от списка.
А вот так можно удалить элементы из множества:
sub_set = add_set
sub_set.remove("violin")
sub_set
# {1, 2, 3, 4, 'cello'}
Функция remove(x) удаляет элемент x из множества. Если же элемента x нет в множестве, то функция возвращает KeyError:
sub_set.remove("guitar")
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# KeyError: 'guitar
Есть еще пара способов удалить элемент из множества:
- метод
discard(x)удаляет элементxиз множества, но не возвращает никаких ошибок, еслиxотсутствует в множестве pop()удаляет и возвращает случайный элемент из множества- метод
clear()удаляет все элементы из множества
Вот несколько примеров для иллюстрации и лучшего понимания:
m_set = set((1, 2, 3, 4))
m_set.discard(5) # Цифры 5 в множестве нет, но ошибка не возникает
m_set.pop()
# 4
m_set
# {1, 2, 3}
m_set.clear()
m_set
# set()
Операции над множествами в Python
Если вы помните основы математики в старшей школе, вы, вероятно, вспомните такие математические операции над множеством, как объединение, пересечение, разность и симметричная разность. Что ж, те же самые операции применимы и ко множествам в Python.
1. Объединение множеств
Результат объединения двух множеств – это множество всех элементов из обоих множеств без дубликатов. Для объединения множеств в Python используется метод union() или оператор |.
first_set = {1, 2, 3}
second_set = {3, 4, 5}
first_set.union(second_set)
# {1, 2, 3, 4, 5}
first_set | second_set # использование оператора `|`
# {1, 2, 3, 4, 5}
2. Пересечение множеств
Результат пересечения двух множеств – это множество всех общих элементов из обоих множеств. Для получения пересечения можно использовать метод crossction() или оператор &.
first_set = {1, 2, 3, 4, 5, 6}
second_set = {4, 5, 6, 7, 8, 9}
first_set.intersection(second_set)
# {4, 5, 6}
first_set & second_set # использование оператора `&`
# {4, 5, 6}
3. Разность множеств
Разность двух множеств – множество из всех элементов первого множества, которых нет во втором множестве. Для получения разности можно использовать метод difference() или оператор -. Чтобы было понятнее, как работает данная операция, внимательно изучите пример:
first_set = {1, 2, 3, 4, 5, 6}
second_set = {4, 5, 6, 7, 8, 9}
first_set.difference(second_set)
# {1, 2, 3}
first_set - second_set # использование оператора `-`
# {1, 2, 3}
second_set - first_set
# {8, 9, 7}
4. Симметричная разность
Симметричная разность двух множеств – это множество из всех элементов, имеющихся только в первом множестве и только во втором, но не в обоих сразу.
Для этой операции вы можете использовать метод symric_difference() или оператор ^.
first_set = {1, 2, 3, 4, 5, 6}
second_set = {4, 5, 6, 7, 8, 9}
first_set.symmetric_difference(second_set)
# {1, 2, 3, 7, 8, 9}
first_set ^ second_set # использование оператора `^`
# {1, 2, 3, 7, 8, 9}
Как изменить множество с помощью операций
Каждая из операций над множествами, которые мы обсуждали выше, может использоваться для изменения существующего множества в Python.
Для обновления значения переменной можно использовать расширенный синтаксис присваивания, такой как += или *=. Со множествами это тоже работает:
a = {1, 2, 3, 4, 5, 6}
b = {4, 5, 6, 7, 8, 9}
a.update(b) # объединение
a
# {1, 2, 3, 4, 5, 6, 7, 8, 9}
a &= b # пересечение
a
# {4, 5, 6, 7, 8, 9}
a -= set((7, 8, 9)) # разность
a
# {4, 5, 6}
a ^= b # симметричная разность
a
# {7, 8, 9}
Другие операции над множествами в Python
Эти операции встречаются не так часто. С их помощью можно увидеть, как множества соотносятся друг с другом. Для осуществления этих операций используются следующие методы и операторы:
a.issubset(b)или оператор<=возвращаетTrue, еслиaявляется подмножествомba.issuperset(b)или оператор>=возвращаетTrue, еслиaявляется надмножествомba.isdisjoint(b)возвращаетTrue, если в множествахaиbнет общих элементов
Frozenset или неизменяемые множества в Python
Поскольку множества изменяемы, они не могут быть хешированы. Это означает, что вы не можете использовать их в качестве ключей словаря.
Python позволяет вам обойти это, используя вместо обычного множества frozenset. У него есть все свойства множества, за исключением того, что он неизменяемый (это означает, что добавлять или удалять элементы из frozenset нельзя). Он также является хешируемым, поэтому его можно использовать в качестве ключей к словарю.
Тип данных frozenset обладает всеми методами обычного множества (например, difference(), symric_difference() или union()), но поскольку он неизменяемый, у него нет методов для добавления и удаления элементов.
a = frozenset((1, 2, 3, 4)) b = frozenset((3, 4, 5, 6)) a.issubset(b) # False a.update(b) # raises an error # Traceback (most recent call last): # File "<stdin>", line 1, in <module> # AttributeError: 'frozenset' object has no attribute 'update'
Использовать же неизменяемое множество в качестве ключей словаря крайне просто:
a = frozenset((1, 2, 3, 4))
b = frozenset(("w", "x", "y", "z"))
d = {a: "hello", b: "world"}
d
# {frozenset({1, 2, 3, 4}): 'hello', frozenset({'w', 'x', 'y', 'z'}): 'world'}
Заключение
Вот и все! В этой статье мы рассмотрели такой тип данных, как множества: что они собой представляют, как их создавать и как работать с ними. Также мы на примерах разобрали различные операции над множествами.
Освоив множества, вы сможете покорить большинство встроенных функций в Python. Все, что вам нужно сейчас – это практика. Удачи и успехов в написании кода!
Перевод статьи «Python Sets – Explained with Examples».

