Мы с вами начали разговор о неупорядоченных типах данных, мы их еще называем коллекциями. Это данные тоже контейнеры, структуры внутри могут храниться переменные, но их отличие от упорядоченных типов данных, например, кортежей, списков или строк в том, что за элементами внутри таких структур не закреплены конкретные места. Например, мы к ним не можем обратиться по индексу. Мы назвали две таких структуры: множества и словари. Сегодня мы будем разбираться с тем, как множество устроено в Python. У меня уже здесь есть ячейка, в ней задано множество. Давайте посмотрим на синтаксис: я использую фигурные скобки и в фигурных скобках, через запятую перечисляю элементы, то есть очень похоже на список и на кортеж, но если со списком мы используем квадратные скобки, с кортежем круглые, то фигурные скобки дают Python сигнал, что перед ним именно множество. Давайте запустим эту ячейку. Ошибки не было, все напечаталось и тип данных — "set". То есть для Python и в англоязычной документации множество это "set". Здесь еще очень важный момент, что в множестве могут храниться только неизменяемые типы данных, это значит, что множество не может содержать внутри себя список или другие множества. Мы с вами позже будем говорить о более сложных структурах данных: о списках-списках или словарях-списках, и там такие структуры встретим. Кортеж во множество может войти, ведь он не изменяемый. Вряд ли вы с такой ситуацией столкнетесь, но это возможно. Мы с вами говорили о том, что множество на самом деле вам скорее всего уже знакомо из математики или логики, и вы знаете, что множество — это собрание уникальных объектов, то есть какой-то объект в множестве может встретиться только один раз. И, например, здесь я определяю мое множество, наш любимый список покупок теперь множество, и перечисляю, у нас здесь наших два любимых молока, которых нам нужно две бутылки. Давайте напечатаем наше множество. Мы видим, что молоко в итоговом множестве осталось один раз. Еще раз повторим: множество — собрание уникальных объектов, какой-то элемент не может встречаться в множестве больше одного раза. Давайте убедимся, что множество действительно неупорядоченно, что в нем не работает индексация. Shopping set, хочу обратиться к нулевому элементу и получаю ошибку. Ошибка "TypeError", мы говорили о том, что такие ошибки обычно связаны с тем, что вы с каким-то типом данных пытаетесь сделать то, что с этим типом данных сделать нельзя. Здесь эта ошибка расшифровывается так, что множество не поддерживает индексацию — неупорядоченный тип данных, индексы не работает. Давайте поговорим про основные операции с множествами, что мы можем с ними делать. Например, мы можем с помощью цикла "for()" перебрать элементы множества, и на самом деле, это по сути единственный способ к ним обратиться, раз индексов нет, а что-то с ними мы сделать хотим. Тут логика точно такая же как со списками, кортежами последовательностями всеми нашими любимыми. Соответственно, мы перебираем элементы и выводим их по очереди. С множествами работает и оператор "in", который делает проверку: есть что-то во множестве или нет. Например, представим, что у нас есть множество животных, которых мы хотим завести. Давайте проверим, входит ли в него собака: "собака in pets_set" — True. Теперь давайте проверим, входит ли в него питон: "питон in pets_set" — False. Да, потому что действительно питона в нашем множестве нет. Естественно, если мы хотим сделать проверку на отсутствие, то все будет работать: питон не входит в наше множество, это правда. Мы можем так же как с последовательностями с множеством использовать операцию Len, чтобы найти количество элементов множества. Давайте узнаем, сколько животных в том множестве животных, которых мы хотим завести или не против завести. Пять, во множестве животных, которых мы хотим завести пять элементов. Теперь давайте посмотрим, как создать множество. Во-первых, мы можем создать пустое множество, как мы создавали пустой список. И есть очень важный момент: если вы помните, пустой список мы могли создать двумя способами: мы могли либо использовать функцию "list", вот у меня получался пустой список; либо я могла написать квадратные скобки, открывающую и закрывающую, у меня тоже получался пустой список. Со множеством аналогично работает функция "set", которая без аргументов создает пустое множество. А вот с помощью пустых фигурных скобок множество создать нельзя. Давайте я запущу эту ячейку, и смотрите: вот здесь я создала пустое множество, вот я его напечатала. Обратите внимание: оно печатается не как пустые фигурные скобки, а как "set" без аргументов. Мы видим, что класс этого объекта — множество. Теперь я создаю, как мне кажется, множество с помощью пустых фигурных скобок, видите, я даже не называю переменную "пустое множество", а "пустое что-то". Я печатаю, выглядит как пустые фигурные скобки, но тип такой переменной — "dict". На самом деле это словарь, о которых мы поговорим чуть позже. Поэтому здесь внимательно: пустое множество пустыми фигурными скобками создать нельзя — это будет другой тип данных. Понятно, пустое множество создать можем, и чуть позже мы посмотрим, как мы в него можем добавлять элементы. А теперь давайте превратим список во множество. Тут на самом деле ничего сложного: я вызываю функцию "set", передаю ей мой список, и получаю множество уникальных объектов списка. Обратите внимание, "молоко" в списке у меня тоже было два раза, и во множестве оно появилось один раз. Давайте проверим, сколько у нас было объектов в списке и сколько объектов в нашем множестве, которое из этого списка получили. Было четыре, а стало, логично, три, потому что "молоко" во множество попало только один раз. Таким же образом мы можем превратить во множество не только список, но и кортеж если нам это понадобится. Теперь давайте посмотрим, как можно считать множество с клавиатуры. На самом деле мы будем считывать строку, с помощью метода "split" превращать ее в список, мы это уже умеем, и потом будем это превращать во множество. Давайте сделаем пошагово. Я буду считывать строку, применять к ней метод "split". Давайте пока выведем промежуточный вариант: я пишу "молоко" "кефир", и у меня получился список элементов в моем списке покупок. Я ввела строку, разбила ее по пробелам, получила список. Если я хочу получить множество, если мне не нужен этот список как промежуточная переменная, я могу прямо здесь применить функцию множество, чтобы она сразу превращала мне этот список в множество и сохраняла его переменную. Запускаю. Давайте введем что-нибудь два раза, чтобы точно убедиться, что все сработало корректно: "молоко" "молоко" "кефир". И вот теперь у меня в переменной хранится множество из двух элементов: "молоко" в него попало один раз, несмотря на то, что мы ввели его два раза. Множество можно получить из строки. Если мы применим функцию множество в какой-то строке, мы получим множество символов, которые входят в эту строку. Например, я применила множество к строке "Hello" и получила четыре символа, потому что l у нас здесь удвоенная. У меня здесь уже записана программа. Давайте посмотрим, какие звуки отрабатывает наша скороговорка, я произносить ее не буду, я думаю сами можете понять почему. Итак, моя скороговорка, дальше я заменяю в ней пробелы, потому что если у меня будут здесь пробелы, то они тоже попадут множество символов в этой строке, ведь множество не знает, что из этого буква, а что пробел, и оно не знают, что пробел нам не нужен. Поэтому пробелы я здесь заменю на отсутствие строки, на пустую строку и приведу к нижнему регистру. Потому что для множества заглавная и строчная буква будут разными элементами, что в принципе логично. Давайте напечатаю здесь нашу скороговорку измененную. Смотрим на этот вывод, это наша промежуточная скороговорка из которой мы удалили пробелы, и которую мы привели к нижнему регистру. Теперь я превращаю мою скороговорку во множество и печатаю ее. Вот моя скороговорка оригинальная, а вот множество букв в моей скороговорке. Обратите внимание, с помощью метода строк "join", мы можем красиво напечатать множество, как мы печатали списки и кортежи, но состоящее только из строк. И вот мы видим, что в нашей скороговорке 22 буквы всего, но только семь из них уникальны. Если мы посмотрим внимательнее, мы как раз увидим здесь в основном те звуки, которые как раз, как мы знаем, эта скороговорка обычно и отрабатывает. И давайте поговорим про методы множеств. В отличие от строк и словарей, у множеств методов не так много, некоторые из них специфические, мы будем говорить про них отдельно в следующем видео. Но самые важные для нас метода множеств это: метод, с помощью которого можем добавить во множество элемент, и метод, с помощью которого мы элементы из множества можем удалить. Ведь мы не можем по индексу обратиться к конкретным элементам внутри множества, поэтому нам нужен какой-то инструментарий, чтобы как-то их, например, оттуда доставать или наоборот их оттуда удалять. Итак, у нас есть множество животных, которых мы хотим завести, там есть: собака, кошка, хомячок, рыбка и морская свинка. Предположим, мы хотим завести еще питона, мы раньше не хотели, а теперь вдруг осознали, что питон нам очень нравится. И я пишу название моего множества, ставлю точку (потому что это метод), и пишу слово "add", именно "add" (добавить). Если в список мы добавляли через append, то здесь слово другое, и в принципе логично, ведь в списке мы записывали объект в конец списка, а здесь мы добавляем во множество: мы не знаем, в конец оно добавится, куда там, оно неупорядоченное. Поэтому — "добавить", слово другое. Я пишу, что мы добавляем "питон". Давайте напечатаем наше множество, посмотрим изменилось ли оно. Да, изменилось: видим, что действительно добавился "питон". Обратите внимание, что он добавился не в конец, ведь, как мы уже говорили, порядок вывода слов во множестве может отличаться от того, который вы видите на экране, потому что множество неупорядоченное, и как оно сохранилось в памяти компьютера мы не контролируем. И вывод у вас может, например, отличаться даже от моего и это нормально. Итак, мы научились добавлять элемент во множество, и давайте теперь научимся удалять элемент из множества. Теперь мы решили заводить питона, и если вдруг мы думаем, что мы хотим всех этих животных завести одновременно, мы начали переживать, что питон может съесть хомячка или морскую свинку. Давайте удалим их из множества животных, которых мы хотели бы завести. Опять пишу название переменной, и теперь метод, который удаляет — remove ("add" — добавь, remove — удали), и здесь мы пишем название элемента, который нужно удалить "морская свинка". Так, давайте я напишу под теми комментариями как у меня указано, здесь мы уделяем "морскую свинку", а здесь удаляем "хомячка". Посмотрим, что получилось: "питона" мы добавили, он во множестве есть, "хомячка" и "морскую свинку" из оригинального множества мы удалили. Таким образом, мы научились удалять и добавлять объекты во множество. Итак, с множеством работают многие конструкции или инструкции, которые раньше работали с последовательностями, с которыми мы познакомились при работе с последовательностями. Например, мы можем узнать количество элементов в множестве и можем перебрать элементы множества с помощью цикла "for()"; можем проверить, входит что-то во множество или нет. Мы научились создавать пустое множество и только что посмотрели, как добавлять в него элементы или как их оттуда удалять. Мы с вами научились другие структуры данных превращать во множество, например, кортеж, строку или список.