Множества
Множества в 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()
. Их ключевое различие заключается в поведении при отсутствии удаляемого элемента в множестве: метод
в таком случае вызывает исключение KeyError, а метод set.remove()
set.discard()
просто ничего не делает.
Методы | set.remove(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 = {"Зелёные груши", "Жёлтые груши", "Жёлтые яблоки"}
Наглядно представить сами множества и операции над ними позволяют диаграммы (круги) Эйлера.
Объединение множеств
Объединение множеств возвращает новое множество, включающее в себя все элементы обоих множеств.
Найти объединение двух множеств позволяет метод set.intersection()
или оператор |
.
Метод | set1.union(set2) |
Описание | Возвращает множество, содержащее все элементы множеств set1 и set2 |
Параметры | set2 – множество, с которым объединяется множество set1 |
Возвращаемое значение | Множество |
Новое множество содержит яблоки и и груши всех цветов, однако в соответствие с требованием уникальности к элементам множества, повторы игнорируются:
union_set = set1.union(set2) # равносильно set1 | set2
print(union_set)
# Вывод: {'Жёлтые яблоки', 'Красные яблоки', 'Зелёные груши', 'Жёлтые груши'}
Пересечение множеств
Пересечение множеств возвращает новое множество, включающее в себя общие элементы обоих множеств.
Найти пересечение двух множеств позволяет метод set.intersection()
или оператор &
.
Метод | set1.intersection(set2) |
Описание | Возвращает множество, содержащее только те элементы множества set1 , которые также принадлежат множеству set2 . |
Параметры | set2 – множество, с которым находится пересечение множества set1 |
Возвращаемое значение | Множество |
Новое множество содержит только жёлтые яблоки и груши, так как они принадлежат обоим множествам:
intersection_set = set1.intersection(set2) # равносильно set1 & set2
print(intersection_set)
# Вывод: {'Жёлтые груши', 'Жёлтые яблоки'}
Разность множеств
Разность множеств возвращает новое множество, в котором присутствуют только те элементы первого множества, которых нет во втором.
Найти разность двух множеств позволяет метод set.difference()
или оператор -
.
Метод | set1.difference(set2) |
Описание | Возвращает множество, содержащее только те элементы множества set1 , которые отсутствуют в множестве set2 . |
Параметры | set2 – множество, с которым находится разность множества set1 |
Возвращаемое значение | Множество |
Новое множество содержит только красные яблоки, так как жёлтые яблоки и груши принадлежат, в том числе, и второму множеству:
print(set1.difference(set2)) # равносильно 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
.