Тип данных set
в Python поддерживает все операции, которые проводятся над множествами в математике:
- пересечение;
- объединение;
- дополнение;
- разность;
- симметрическую разность.
Множества set
обладают рядом особенностей, которые значительно отличают их от других типов данных.
Особенности множеств в Python
1. В Python два вида множеств – обычное, изменяемое set
и замороженное, неизменяемое frozenset
. Замороженные множества нельзя изменить после создания, но все операции по объединению, пересечению и разности они поддерживают: результатом этих операций тоже будут frozenset
.
2. Множество может включать в себя только неизменяемые типы данных – строки, числа, кортежи (в любой комбинации). Попытка добавить в множество список, словарь или изменяемое множество приведет к ошибке:
Неизменяемое множество frozenset
, в отличие от set
, может входить в изменяемое множество:
3. Элементы во множествах хранятся в неупорядоченном виде, и к ним нельзя обратиться по индексу:
4. Поскольку элементы множества не имеют индексов, срезы при работе с set
тоже использовать нельзя:
5. Все элементы множества – уникальны, повторяющиеся данные в set
игнорируются; это свойство множеств может пригодиться для решения практических задач:
6. Множества не поддерживают конкатенацию и повторение:
7. Множества занимают значительно больший объем памяти, нежели списки и кортежи. По этой причине лучше не использовать множества для решения задач с лимитом на объем памяти:
8. Хотя множества занимают гораздо больший объем памяти, чем списки и кортежи, работают они гораздо быстрее. Этот код сравнивает время, затраченное на проведение операции над списком, кортежем и множеством с одинаковым количеством элементов:
Результат:
Создание множеств в Python
Пустое множество можно создать только одним способом, с помощью set()
:
Попытка создать пустое множество с помощью фигурных скобок {}
обречена на провал – вместо set
будет создан словарь dict
:
Множество с данными можно создать несколькими способами.
Способ 1: Перечисление элементов
Для создания множества нужные элементы перечисляют через запятую в фигурных скобках:
Способ 2: Преобразование других типов данных
Множество можно создать на основе символов либо слов строки:
Множество из списка:
Множество на основе кортежа:
При создании множества из dict
от словаря останутся только ключи:
В отличие от символов строк, число нельзя автоматически разбить на отдельные цифры и преобразовать во множество напрямую:
Но с применением str
преобразование проходит без ошибок:
Способ 3: Генераторы множеств
Как и в случае со списками и словарями, для создания множеств удобно использовать генераторы:
В генераторах можно использовать любые условия:
В генератор можно включить любые дополнительные функции, например, ввод input()
и функцию ord()
для возвращения числового кода символа из таблицы Unicode:
Помимо условия if
, в генератор можно добавить обработку else
:
Стандартные методы множеств в Python
Множества поддерживают ряд стандартных методов, общих для большинства коллекций Python, и имеют несколько собственных, уникальных для типа set
. Начнем с общих методов.
Длина, сумма, min и max элементы
Эти методы работают со множествами точно так же, как и со списками и кортежами:
Принадлежность элемента множеству
Сортировка
Как и в случае с кортежами, результатом сортировки множества будет список:
Сравнение множеств
Множества можно сравнивать с помощью операторов ==
и !=
:
Другие операторы сравнения, например >
и <
, дают неожиданный на первый взгляд результат:
Это связано с тем, что при сравнении множеств Python определяет, является ли одно из них под- или надмножеством другого (подробнее об этом – ниже):
Добавление элемента
Метод add()
добавляет во множество новый элемент:
Несколько элементов можно добавить с помощью цикла for
(мы рассмотрим его в следующей статье) или с помощью генератора:
Удаление элемента
Для удаления элемента нужно воспользоваться одним из поддерживаемых методов:
1. remove()
– возвращает сообщение об ошибке, если элемент не будет найден:
2. discard()
– безопасный метод, не приводит к ошибке в случае отсутствия элемента:
3. pop()
– в отличие от аналогичного списочного метода, удаляет случайный элемент и возвращает его значение:
4. Метод clear() удаляет все элементы множества сразу – так можно освободить оперативную память после завершения операции с объемным set
:
Специальные методы множеств
Как уже упоминалось выше, объекты set
в Python поддерживают все операции, которые проводятся над множествами в математике. Эти операции делятся на три группы:
- Не изменяющие исходные множества – эти методы возвращают новые множества.
- Изменяющие исходные множества.
- Определяющие, являются ли множества под(над)множествами друг друга – эти методы возвращают
True
илиFalse
.
Рассмотрим методы из этих групп подробнее.
Методы, не изменяющие исходные множества
Объединение множеств
Объединение множеств union ()
– это множество, которое состоит из элементов, входящих в состав хотя бы одного из объединяемых множеств:
Вместо union()
можно использовать оператор |
:
Пересечение множеств
Пересечением множеств intersection()
называется множество, которое состоит из элементов, входящих в каждое из пересекающихся множеств:
Вместо intersection()
можно использовать оператор &
:
Разность множеств
Разностью множеств difference()
называется множество, в которое входят все элементы первого множества, не входящие во второе множество:
Вместо difference()
можно использовать оператор -
:
Симметрическая разность
Симметрической разностью symmetric_difference()
называется множество, состоящее из элементов, которые не входят в первое и второе множество одновременно:
В качестве оператора симметрической разности используется ^
:
Методы, изменяющие исходные множества
Метод update()
Изменяет исходное множество по объединению:
Оператор метода update
– |=
:
Метод intersection_update()
Изменяет исходное множество по пересечению:
Оператор intersection_update()
– &=
:
Метод difference_update()
Изменяет исходное множество по разности:
Оператор difference_update()
– -=
:
Метод symmetric_difference_update()
Изменяет исходное множество по симметрической разности:
Оператор symmetric_difference_update()
– ^=
:
Методы для определения под- и надмножеств
Множество set_a считается подмножеством set_b в том случае, если все элементы set_a входят в set_b. В свою очередь, множество set_b этом случае считается надмножеством set_a. При этом любое множество считается подмножеством самого себя, или нестрогим подмножеством.
Для определения под- и надмножеств в Python есть три метода:
1. issuperset()
– возвращает True
, если первое множество является подмножеством второго, и False
в обратном случае. Такой же результат можно получить с помощью операторов <
(строгое подмножество) и <=
(нестрогое подмножество):
2. issubset()
– возвращает True
, если одно множество является надмножеством другого, и False
в противном случае. Аналог – операторы >
(строгое надмножество) и >=
(нестрогое надмножество):
3. isdisjoint()
– возвращает True
, если множества не имеют общих элементов, и False
, если такие элементы есть:
Практика
Задание 1
Напишите программу, которая получает на вход три слова и определяет, являются ли они анаграммами друг друга.
Пример ввода:
Вывод:
Решение:
Задание 2
Напишите программу, которая получает на вход две строки с перечислением интересов и хобби двух пользователей, и вычисляет процент совпадения.
Пример ввода:
Вывод:
Решение:
Задание 3
Напишите программу, которая получает на вход строку, и определяет, является ли строка панграммой (т.е. содержатся ли в ней все 33 буквы русского алфавита).
Пример ввода:
Вывод:
Решение:
Задание 4
Напишите программу, которая получает n слов, и вычисляет количество уникальных символов во всех словах.
Пример ввода:
Вывод:
Решение:
Задание 5
Напишите программу, которая:
- Получает на вход две строки, в которых перечисляются книги, прочитанные двумя учениками.
- Выводит количество книг, которые прочитали оба ученика.
Пример ввода:
Вывод:
Решение:
Задание 6
Напишите программу, которая получает от пользователя две строки с числами, и выводит в порядке возрастания числа, встречающиеся в обеих строках.
Пример ввода:
Вывод:
Задание 7
Напишите программу, которая получает два числа и выводит Есть
, если числа содержат общие цифры, и Нет
в противном случае.
Пример ввода:
Вывод:
Решение:
Задание 8
Напишите программу, которая получает строку с именами файлов, и выводит уникальные имена .jpg файлов, отсортированные в алфавитном порядке.
Пример ввода:
Вывод:
Решение:
Задание 9
Два дизайнера поспорили о том, кто из них знает больше оттенков цветов. Они перечисляют оттенки, но иногда забывают о том, что уже называли какой-то тон. Напишите программу, которая получает на вход n строк с названиями оттенков, и определяет, есть ли среди них повторы. Если повтор есть, нужно вывести Повтор
, если нет – Принято
.
Пример ввода:
Вывод:
Решение:
Задание 10
Кондитер собирается испечь торт. Напишите программу, которая поможет определить, имеются ли в кладовой все необходимые продукты:
- Сначала программа получает список из m продуктов, которые есть в кладовой.
- Затем получает n ингредиентов, необходимых для рецепта.
- Выводит
Есть
, если ингредиент имеется в кладовой, иОтсутствует
в противном случае.
Пример ввода:
Вывод:
Решение:
Подведем итоги
Множества позволяют просто и лаконично решать задачи, связанные с уникальностью, вхождением элементов в определенные группы и совпадением (расхождением) в составе групп. Однако множества в Python имеют серьезный недостаток – они занимают значительный объем памяти, что может стать проблемой при решении олимпиадных задач. В следующей статье будем изучать цикл for.
Содержание самоучителя
- Особенности, сферы применения, установка, онлайн IDE
- Все, что нужно для изучения Python с нуля – книги, сайты, каналы и курсы
- Типы данных: преобразование и базовые операции
- Методы работы со строками
- Методы работы со списками и списковыми включениями
- Методы работы со словарями и генераторами словарей
- Методы работы с кортежами
- Методы работы со множествами
- Особенности цикла for
- Условный цикл while
- Функции с позиционными и именованными аргументами
- Анонимные функции
- Рекурсивные функции
- Функции высшего порядка, замыкания и декораторы
- Методы работы с файлами и файловой системой
- Регулярные выражения
- Основы скрапинга и парсинга
- Основы ООП: инкапсуляция и наследование
- Основы ООП – абстракция и полиморфизм
- Графический интерфейс на Tkinter
- Основы разработки игр на Pygame
- Основы работы с SQLite
- Основы веб-разработки на Flask
- Основы работы с NumPy
- Основы анализа данных с Pandas
Комментарии