undo
search menu close

Множества

📅 4 мая 2025 г. 10:14

Множества в Python похожи на списки и кортежи тем, что хранят наборы элементов разных типов, но обладают двумя ключевыми особенностями: неупорядоченность и уникальность. То есть вы не можете обратиться к элементам множества по индексу, так как они не хранятся в каком-либо определенном порядке, а также множество автоматически удаляет все повторяющиеся элементы, оставляя только уникальные значения

Создание множества

Существует несколько способов создания множеств в Python:

1. Множество создаётп еречисление элементов через запятую внутри фигурных скобок {}:

berries = {"Рябина", "Черёмуха", "Земляника"}

2. В множество можно преобразовать другую коллекцию с помощью функции set().

Функция set(iterable)
Описание Создаёт множество из всех объектов коллекции iterable
Параметры iterable – коллекция для преобразования в список
Возвращаемое значение Множество

Множество будет содержать все элементы коллекции, из которой оно создано, исключая дубликаты:

plant = "Кукуруза"
print(set(plant)) 
# Вывод: {'К', 'р', 'а', 'у', 'з', 'к'}

numbers = [1, 2, 2, 3, 3, 3]
print(set(numbers)) 
# Вывод: ["Эрмитаж", "Петропавловская крепость", "Летний сад"]

Так как элементы в множестве не упорядочены, то исходный порядок элементов может не сохраниться:

food = ("Хлеб", "Масло", "Хлеб", "Масло", "Джем")
food_set = set(food)
print(food_set)
# Вывод: {'Хлеб', 'Масло', 'Джем'}
print(food_set)
# Вывод: {2, 1, 3}

Создание пустого множества

Пустое множество создаёт вызвать функция set() без аргументов:

menu = set()

Однако его нельзя создать, используя пустые фигурные скобки, так как они создают словарь:

menu = {}
print(type(menu))
# Вывод: <class 'dict'>

Добавление элементов в множество

Для добавления одного элемента в уже существующее множество используется метод set.add().

Метод set.add(item)
Описание Добавляет в множество set элемент item
Параметры item – объект, который нужно добавить в множество
Возвращаемое значение None

Элемент будет добавлен только, если он отсутствует в множестве, иначе множество останется неизменным:

transport = {"Автобус", "Трамвай", "Такси"}
transport.add("Метро")
print(transport)
# Вывод: {'Метро', 'Автобус', 'Такси', 'Трамвай'}
transport.add("Автобус")
print(transport)
# Вывод: {'Метро', 'Автобус', 'Такси', 'Трамвай'}

Удаление элементов из множества

Из множества можно удалить как элемент по значению, так и случайный элемент, а также можно удалить все элементы множества.

Удаление элемента по значению

Для удаления из множества элемента по его значению существует два метода – set.remove() и set.discord(). Их ключевое различие заключается в поведении при отсутствии удаляемого элемента в множестве: метод set.remove() в таком случае вызывает исключение KeyError, а метод set.discard() просто ничего не делает.

Методы set.remove(item)
set.discard(item)
Описание Удаляет элемент item из множества set
Параметры item – объект, который нужно удалить
Возвращаемое значение None

Например, используем метод set.remove() и удалим число 1 из следующего множества:

numbers = {1, 2, 3, "один", "два", "три"}
numbers.remove(1)
print(numbers)
# Вывод: {2, 3, "один", "два", "три"}

Однако если попытаться удалить элемент, которого нет в множестве, будет вызвано исключение KeyError:

numbers = {1, 2, 3, "один", "два", "три"}
numbers.remove("пять")
print(numbers)
# Ошибка: KeyError: 'пять'

В таком случае следует использовать метод set.discard(), который перед удалением проверяет наличие элемента в множестве:

numbers = {1, 2, 3, "один", "два", "три"}
numbers.discard("пять")
print(numbers)
# Вывод: {1, 2, 3, "один", "два", "три"}

Так как элемент "пять" отсутствует в множестве, то исходное множество осталось неизменным.

Удаление случайного элемента множества

Случайный элемент множества можно и удалить с помощью метода set.pop().

Метод set.pop()
Описание Удаляет и возвращает случайный элемент множества set
Возвращаемое значение Удаляемый элемент

Но как и в случае метода списков list.pop(), данный метод не просто удаляет элемент, а возвращает его:

mail = {"mail.ru", "yandex.ru", "gmail.com"}
deleted_mail = mail.pop()
print(f"Удалённый элемент - {deleted_mail}")
print(mail)
# Вывод: Удалённый элемент - gmail.com
# Вывод: {"mail.ru", "yandex.ru"}

Удаление всех элементов множества

Также можно полностью очистить множество, используя метод set.clear().

Метод set.clear()
Описание Удаляет все элементы множества set
Возвращаемое значение None

В таком случае множество станет пустым:

video = {"rutube", "youtube"}
video.clear()
print(video)
# Вывод: {}

Операции над множествами

Множества в Python пришли из математики, где над ними можно совершать такие операции как объединение и пересечение, а также находить разность и симметричную разность. В Python каждой такой операции соответствует свой оператор и метод.

Оператор Метод Операция
| set.union() Объединение множеств
& set.intersection() Пересечение множеств
- set.difference() Разность множеств
^ set.symmetric_difference() Симметричная разность множеств

В качестве примера давайте рассмотрим множества красных яблок и зелёных груш, каждое из которых также содержит жёлтые яблоки и груши.

Создадим оба множества на Python:

set1 = {"Красные яблоки", "Жёлтые яблоки", "Жёлтые груши"}
set2 = {"Зелёные груши", "Жёлтые груши", "Жёлтые яблоки"}

Наглядно представить сами множества и операции над ними позволяют диаграммы (круги) Эйлера.

Image Gallery

Множества set1 и set2

Объединение множеств

Объединение множеств возвращает новое множество, включающее в себя все элементы обоих множеств.

Image Gallery

set1 | set2

Найти объединение двух множеств позволяет метод set.intersection() или оператор |.

Метод set1.union(set2)
Описание Возвращает множество, содержащее все элементы множеств set1 и set2
Параметры set2 – множество, с которым объединяется множество set1
Возвращаемое значение Множество

Новое множество содержит яблоки и и груши всех цветов, однако в соответствие с требованием уникальности к элементам множества, повторы игнорируются:

union_set = set1.union(set2)  # равносильно set1 | set2
print(union_set)
# Вывод: {'Жёлтые яблоки', 'Красные яблоки', 'Зелёные груши', 'Жёлтые груши'}

Пересечение множеств

Пересечение множеств возвращает новое множество, включающее в себя общие элементы обоих множеств.

Image Gallery

set1 & set2

Найти пересечение двух множеств позволяет метод set.intersection() или оператор &.

Метод set1.intersection(set2)
Описание Возвращает множество, содержащее только те элементы множества set1, которые также принадлежат множеству set2.
Параметры set2 – множество, с которым находится пересечение множества set1
Возвращаемое значение Множество

Новое множество содержит только жёлтые яблоки и груши, так как они принадлежат обоим множествам:

intersection_set = set1.intersection(set2)  # равносильно set1 & set2
print(intersection_set)  
# Вывод: {'Жёлтые груши', 'Жёлтые яблоки'}

Разность множеств

Разность множеств возвращает новое множество, в котором присутствуют только те элементы первого множества, которых нет во втором.

Image Gallery

set1 - set2

Найти разность двух множеств позволяет метод set.difference() или оператор -.

Метод set1.difference(set2)
Описание Возвращает множество, содержащее только те элементы множества set1, которые отсутствуют в множестве set2.
Параметры set2 – множество, с которым находится разность множества set1
Возвращаемое значение Множество

Новое множество содержит только красные яблоки, так как жёлтые яблоки и груши принадлежат, в том числе, и второму множеству:

print(set1.difference(set2))  # равносильно set1 - set2
# Вывод: {'Красные яблоки'}

Симметричная разность множеств

Симметричная разность множеств возвращает новое множество, в котором присутствуют все элементы, кроме общих.

Image Gallery

set1 ^ set2

Найти симметричную разность двух множеств позволяет метод set.symmetric_difference() или оператор ^.

Метод set1.symmetric_difference(set2)
Описание Возвращает множество, содержащее только те элементы множеств set1 и set2, которые не принадлежат одновременно обоим множествам
Параметры set2 – множество, с которым находится симметричная разность множества set1
Возвращаемое значение Множество

Новое множество содержит только красные яблоки и зелёные груши, так как исключаются все общие элементы, то есть жёлтые яблок и груш:

print(set1.symmetric_difference(set2))  # равносильно set1 ^ set2
# Вывод: {'Зелёные груши', 'Красные яблоки'}

Операторы с присваиванием для работы с множествами

Как и арифметические операторы, операторы для работы с множествами можно совмещать с оператором присваивания и таким образом сразу присваивать новое значение переменной с исходным множеством.

Вспомним исходные элементы рассматриваемых множеств:

set1 = {"Красные яблоки", "Жёлтые яблоки", "Жёлтые груши"}
set2 = {"Зелёные груши", "Жёлтые груши", "Жёлтые яблоки"}

И определим объединение, пересечение, разность и симметричную разность данных множеств:

# Объединение:
set1 |= set2
print(set1)
# Вывод: {'Жёлтые яблоки', 'Красные яблоки', 'Зелёные груши', 'Жёлтые груши'}

# Пересечение:
set1 &= set2
print(set1)
# Вывод: {'Жёлтые груши', 'Жёлтые яблоки'}

# Разность:
set1 -= set2
print(set1)
# Вывод: {'Красные яблоки'}

# Симметричная разность:
set1 ^= set2
print(set1)
# Вывод: {'Зелёные груши', 'Красные яблоки'}

Во всех случаях исходное множество set1 перезаписывается новым множеством.

Сравнение множеств

Множества можно сравнивать между собой, определяя, является ли одно множество частью другого.

Например, у нас есть множество овощей, а также множество ингредиентов для овощного салата:

vegetables = {"Морковка", "Картошка"}
salad = {"Морковка", "Картошка", "Яйца", "Майонез", "Соль"}

Так как все элементы множества vegetables присутствуют в множестве salad, то множество vegetables является подмножеством множества salad, а множество salad – его надмножеством.

В таком случае можно сказать, что подмножество всегда меньше или равно надмножеству, поэтому можно использовать уже знакомый нам оператор сравнения <=. И наоборот, так как надмножество всегда больше или равно подмножеству, можно использовать оператор сравнения >=:

print(salad >= vegetables)
# Вывод: True

print(vegetables <= salad)
# Вывод: True

Каждому из операторов сравнения соответствует свой специальный методы. Так метод set1.issuperset(set2) проверяет содержит ли множество set1 множество set2, а метод set1.issubset(set2), наоборот, проверяет является ли множество set1 частью множества set2.

Метод set1.issuperset(set2)
Описание Возвращает True, если множество set1 содержит множество set2, то есть является его надмножеством, иначе – False
Параметры set2 – множество, с которым сравнивается множество set1
Возвращаемое значение True или False
Метод set1.issubset(set2)
Описание Возвращает True, если множество set1 представляет собой часть множества set2, то есть является его подмножеством, иначе – False
Параметры set2 – множество, с которым сравнивается множество set1
Возвращаемое значение True или False

Результат использования этих методов совпадает с результатом использования операторов сравнения:

vegetables = {"Морковка", "Картошка"}
salad = {"Морковка", "Картошка", "Яйца", "Майонез", "Соль"}
print(salad.issuperset(vegetables))
# Вывод: True
print(vegetables.issubset(salad))
# Вывод: True
Задания для самопроверки

1. В чём заключаются основные отличия множеств от списков и кортежей?

 
Ответ

2. Дан список: duplicates = [1, 2, 2, 3, 4, 4, 5, 5, 5]. Напишите программу, которая преобразует этот список в множество для удаления дубликатов, а затем снова преобразовывает полученное множество в список. Результат должен быть выведен на экран.

 
Ответ

3. Напишите программу, которая создаёт пустое множество empty_set, добавляет в него элементы 10 и 20 и выводит полученное множество на экран.

 
Ответ

4. Даны два множества: set_a = {1, 2, 3, 4, 5} и set_b = {4, 5, 6, 7, 8}. Напишите программу, которая находит результат объединения, пересечения и симметричной разности этих множеств, а также результат разности множества set_a с множеством. set_b.

 
Ответ

5. Даны два множества: colors1 = {"Красный", "Синий", "Желтый"} и colors2 = {"Синий", "Желтый"}. Напишите программу, которая проверяет, является ли множество colors1 надмножеством или подмножеством множества colors2.

 
Ответ
arrow_back_ios Назад
Дальше arrow_forward_ios

 💬 0 комментариев
person
email