Множества в Python – объяснение с примерами

Если вы новичок в Python, то, скорее всего, уже сталкивались со списками. Однако слышали ли вы про множества в Python?

В этой статье мы рассмотрим, что такое множества, как их создавать и какие операции с ними можно совершать.

Что такое множества в Python?

В Python множества очень похожи на списки, за исключением того факта, что их элементы неизменяемы. Это означает, что вы не можете изменять элементы уже объявленного множества. Но добавлять и удалять элементы из множества можно.

Другими словами, множество – это изменяемая неупорядоченная группа элементов, в которой сами элементы неизменяемы.

Другой особенностью множества является то, что оно может включать в себя элементы разных типов. Это означает, что у вас в одном множестве могут быть числа, строки и и даже кортежи !

python logo

Марк Лутц «Изучаем Python»

Скачивайте книгу у нас в телеграм

×

Как создать множество

Наиболее распространенный способ создания множества в 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».