Если вы новичок в 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
является подмножествомb
a.issuperset(b)
или оператор>=
возвращаетTrue
, еслиa
является надмножествомb
a.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».