Объекты типа set
Объекты типа set
Множество — составной тип данных, представляющий собой несколько значений (элементов множества) под одним именем. Этот тип называется set, не создавайте, пожалуйста, переменные с таким именем! Чтобы задать множество, нужно в фигурных скобках перечислить его элементы.
Введите этот код в Python и запустите программу несколько раз. Скорее всего, вы увидите разный порядок перечисления млекопитающих, так происходит потому, что элементы в множестве Python не упорядочены.
Порядок элементов в множестве выбирается случайным образом при запуске в целях безопасности, чтобы нельзя было перегрузить внутреннюю структуру множеств специальной последовательностью элементов, которая приведет к постоянной перестройке структуры.
Создание множества
Для создания пустых множеств обязательно вызывать функцию set:
Обратите внимание: элементами множества могут быть строки или числа. Возникает вопрос: а может ли множество содержать и строки, и числа? Давайте попробуем:
Как видим, множество может содержать и строки, и числа, а Python опять выводит элементы множества в случайном порядке. Заметьте, если поставить в программе оператор вывода множества на экран несколько раз, не изменяя само множество, порядок вывода элементов не изменится.
Может ли элемент входить в множество несколько раз?
Это было бы странно, так как совершенно непонятно, как отличить один элемент от другого. Нет смысла хранить несколько одинаковых объектов, удобно иметь контейнер, сохраняющий только уникальный объекты. Поэтому множество содержит каждый элемент только один раз. Следующий фрагмент кода это демонстрирует:
!!! note "Итак, у множеств есть три ключевые особенности: - Порядок элементов в множестве не определен - Элементы множеств — строки и/или числа - Множество не может содержать одинаковых элементов
Операции над множеством
Простейшая операция — вычисление числа элементов множества. Для этого служит функция len. Мы уже встречались с этой функцией раньше, когда определяли длину строки:
Далее можно вывести элементы множества с помощью функции print:
Очень часто необходимо обойти все элементы множества в цикле. Для этого используется цикл for и оператор in, с помощью которых можно перебрать не только все элементы диапазона (как мы это делали раньше, используя range), но и элементы множества:
Однако, как и в прошлый раз, в вашем случае порядок может отличаться: заранее он неизвестен. Код для работы с множествами нужно писать таким образом, чтобы он правильно работал при любом порядке обхода. Для этого надо знать два правила: - Если мы не изменяли множество, порядок обхода элементов тоже не изменится - После изменения множества порядок элементов может измениться произвольным образом
Чтобы проверить наличие элемента в множестве, можно воспользоваться уже знакомым оператором in:
Выражение elem in my_set возвращает True, если элемент есть в множестве, и False, если его нет.
Добавление элемента в множество делается при помощи add:
add — что-то вроде функции, «приклеенной» к конкретному множеству. Такие «приклеенные функции» называются методами.
Таким образом, если в коде присутствует имя множества, затем точка и еще одно название со скобками, второе название — имя метода.
Если элемент, равный new_elem, уже существует в множестве, оно не изменится, поскольку не может содержать одинаковых элементов. Ошибки при этом не произойдет. Небольшой пример
С удалением элемента сложнее. Для этого есть сразу три метода:
discard(удалить заданный элемент, если он есть в множестве, и ничего не делать, если его нет)remove(удалить заданный элемент, если он есть, и породить ошибкуKeyError, если нет)pop. Методpopудаляет некоторый элемент из множества и возвращает его как результат. Порядок удаления при этом неизвестен.
На первый взгляд, странно, что есть метод remove, который увеличивает количество падений вашей программы. Однако если вы на 100 % уверены, что элемент должен быть в множестве, то лучше получить ошибку во время отладки и исправить ее, чем тратить время на поиски при неправильной работе программы.
Метод pop удаляет из множества случайный элемент и возвращает его значение:
Результат работы случаен, например, такой код может вывести следующее:
Если попытаться применить pop к пустому множеству, произойдет ошибка KeyError.
Очистить множество от всех элементов можно методом clear:
Операции над двумя множествами
Есть четыре операции, которые из двух множеств делают новое множество: объединение, пересечение, разность и симметричная разность.
Объединение
Объединение двух множеств включает в себя все элементы, которые есть хотя бы в одном из них. Для этой операции существует метод union:
Или можно использовать оператор |:
Пересечение
Пересечение двух множеств включает в себя все элементы, которые есть в обоих множествах:
Или аналог:
Разность
Разность двух множеств включает в себя все элементы, которые есть в первом множестве, но которых нет во втором:
Или аналог:
Симметричная разность
Симметричная разность двух множеств включает в себя все элементы, которые есть только в одном из этих множеств:
Или аналогичный вариант:
Сравнение множеств
Все операторы сравнения множеств, а именно: ==, <, >, <=, >=, возвращают True, если сравнение истинно, и False — в противном случае.
Равенство и неравенство множеств
Множества считаются равными, если они содержат одинаковые наборы элементов. Равенство множеств, как в случае с числами и строками, обозначается оператором ==. Неравенство множеств обозначается оператором !=. Он работает противоположно оператору ==.
Подмножество и надмножество
Подмножество — некоторая выборка элементов множества, которая может быть как меньше множества, так и совпадать с ним, на что указывают символы < и = в операторе <=. Наоборот, надмножество включает все элементы некоторого множества и, возможно, какие-то еще.
Операция s1 < s2 означает «s1 является подмножеством s2, но целиком не совпадает с ним». Операция s1 > s2 означает «s1 является надмножеством s2, но целиком не совпадает с ним».
Задачи
Задача 1
Считайте n строк и выведите количество уникальных слов среди них.
Тест 1:
Ввод:
Вывод:Задача 2
Считайте n городов. Затем считайте новый город и проверьте, был ли он уже назван. Выведите TRY ANOTHER если был, OK если не был.
Тест 1:
Ввод:
Вывод:Тест 2:
Ввод:
Вывод:Задача 3
Считайте числа первого списка (до пустой строки), затем числа второго списка (до пустой строки). Выведите числа, встречающиеся в обоих списках, через пробел. Если таких нет — выведите EMPTY.
Тест 1:
Ввод:
Вывод:Тест 2:
Ввод:
Вывод:Задача 4
Считайте m учеников, изучающих английский, и n учеников, изучающих немецкий. Выведите количество учеников, изучающих только один язык. Если таких нет — NO.
Тест 1:
Ввод:
Вывод:Задача 5
Считайте m книг из домашней библиотеки, затем n книг из летнего списка. Для каждой книги из летнего списка выведите YES, если она есть в библиотеке, иначе NO.
Тест 1:
Ввод:
Вывод:Задача 6
Считайте m листков посещаемости (на каждом листке: сначала число учеников k, затем k фамилий). Выведите фамилии учеников, присутствовавших на всех уроках.
Тест 1:
Ввод:
Вывод:Задача 7
Считайте n фамилий сотрудников. Выведите количество однофамильцев (тех, чья фамилия встречается не один раз).
Тест 1:
Ввод:
Вывод:Задача 8
Считайте m продуктов из холодильника. Затем считайте n рецептов — для каждого: название и ингредиенты через пробел. Выведите названия рецептов, которые можно приготовить из имеющихся продуктов.
Тест 1:
Ввод:
Вывод:Задача 9
Считайте m доступных блюд, затем n дней — на каждый день список приготовленных блюд через пробел. Выведите блюда, ни разу не приготовленные за весь период.
Тест 1:
Ввод:
Вывод:Задача 10
Считайте два множества чисел (каждое — числа через пробел). Выведите их симметричную разность (элементы, входящие ровно в одно из множеств) в виде чисел через пробел. Если результат пустой — EMPTY.
Тест 1:
Ввод:
Вывод: