Итак, давайте вспомним, что вы изучили во второй половине курса. Мы начали с неструктурированных типов данных, таких как множества и словари. Множества, или по-другому как они называются в Python — "set", хранят в себе данные не в определенном порядке, в отличие от списков и кортежей. То есть мы, например, не сможем получить какой-то элемент по его индексу, но зато у него есть другие преимущества: например, множество хранит в себе только уникальные элементы. Что это значит? Например, я создаю множество "my_set", и в него дважды входит строка "хлеб"; и после этого, если я проверю длину множества (количество элементов в нем) с помощью функции "len", то результат будет "3", потому что строка "хлеб" войдет в это множество только один раз. То есть если нужно посчитать количество уникальных элементов в какой-то структуре, множество — отличный выбор. Во множество можно добавлять элементы с помощью метода "add", можно удалять из него элементы с помощью метода "remove" и также можно проверить, лежит ли какой-то элемент во множестве с помощью ключевого слова "in", которое вы на самом деле уже изучали в первой половине курса, но здесь мы удостоверились, что на множествах оно тоже работает. Также со множествами можно выполнять различные специальные операции: например, мы можем объединить множества с помощью такой вертикальной черты, и объединение даст нам элементы, которые лежат и в первом множестве, и во втором множестве (и там, и там); пересечение даст нам элементы, которые находятся обязательно и в первом множестве, и во втором; разница множеств даст нам элементы, которые находятся в первом множестве, но при этом без элементов, которые находятся во втором. Так же по аналогии будет работать обратная разница: мы смотрим на разницу из "a" в "b" и из "b" в "a". И также на множествах есть такая операция, как симметрическая разность — она вернет элементы, которые есть в первом множестве, во втором множестве, но не в их пересечении. Далее мы изучили словари, или как они называются в Python "dict". Словари помогают сопоставлять определенным значениям некие другие значения, то есть они хранят в себе определенные пары, эти пары называются "ключ" и "значение". Например, в этом словаре мы в качестве ключей используем названия продуктов, а в качестве значений — количества этих продуктов у нас дома, например: два пакета молока, три буханки хлеба. И теперь я могу получить количество определенных продуктов по их названиям. Для этого я пишу название словаря, и в квадратных скобочках я пишу название нужного продукта, например, количество буханок хлеба. Точно так же, как и во множествах, в словарях я могу использовать оператор "in" для проверки наличия какого-то ключа во множестве. И здесь я использую этот оператор для того, чтобы проверить, есть какая-то пара ключ-значение в словаре или нет: если нет, то мы можем ее добавить, просто написав название словаря, далее в квадратных скобочках нужный ключ и просто присвоить нужное значение, и если этой пары раньше не было в словаре, она появится, а если была, то перезатрется новым значением; если такая пара ключ-значение уже есть, то мы можем просто обновить значение. Удалить пару ключ-значение мы можем с помощью ключевого слова "del"; также важно помнить, как ключи перебираются в циклах. Если мы просто сделаем перебор по словарю (без каких-либо методов), то у нас произойдет перебор по ключам. Также перебор по ключам можно осуществить с помощью метода "keys". Если мы хотим обязательно сделать перебор по значениям словаря, то нам нужно применить к словарю метод "values". Еще мы можем перебрать сразу пары — ключ и значение, применив метод словаря "items". Изученные нами структуры данных могут быть вложены друг в друга. Например, значениями в словарях могут быть списки, и перед нами как раз такой пример: словарь, ключи в котором — это названия групп, а значения — это списки песен этих групп. И теперь, если мы хотим получить песню The Beatles "Yesterday", то мы берем название нашего словаря, получаем значение по ключу "The Beatles", и это значение — список всех песен The Beatles; и теперь мы хотим получить песню "Yesterday": она стоит под индексом "1", и мы получаем элемент с индексом "1". Также значениями в словарях могут быть другие словари. Например, перед нами словарь, в котором ключи по-прежнему — названия групп, а значения — это уже словари, в которые входят две пары: ключ "song" хранит в себе название песни, а ключ "year" сопоставляет год выпуска этой песни. И теперь, если я хочу получить 1984 год — год выпуска песни "Radio Ga Ga", я получаю значение, которое сопоставляется названию группы Queen: для этого я пишу название словаря, в квадратных скобочках "Queen", и дальше в квадратных скобочках я пишу ключ, значение для которого мне нужно получить — это ключ "year", и мы получаем значение "1984". Далее мы с вами научились сортировать наши данные — это частая задача, нам очень часто приходится упорядочить данные в определенном порядке в реальной жизни. Для этого мы пользуемся функцией, которая называется "sorted". Вот, например, я сортирую некий список целых чисел, и он у меня просто отсортировался по возрастанию. Если я хочу отсортировать в обратном порядке (по убыванию), то я задаю параметр с именем "reverse", и я задаю "reverse", равное "True" — тогда у нас отсортируется все в обратном порядке. Если я попробую отсортировать строки, которые записаны в разном регистре, то у нас получится сортировка не совсем в таком порядке, в котором мы, наверное, ожидаем: мы хотим отсортировать в лексикографическом порядке, но так получается, что код символов больших меньше, чем код символов маленьких. Поэтому у нас сортировка всегда первыми выведет большие символы (поставит им приоритет), а потом уже маленькие символы. Изменить порядок сортировки, автоматически определенный, мы можем, задав параметр с именем "key" — в качестве параметра "key" мы передаем некую функцию, и она будет сортировать элементы так, как будто к ним всем применена вот эта функция. То есть теперь, если я для нашей сортировки ("sorted") передам "key", равный "lower" (метод строки "lower"), то они все будут сортироваться так, как будто бы они все записаны маленькими буквами. И у нас результат сортировки будет уже не "ЯБЛОКО", "арбуз", "банан", а "арбуз", "банан", "ЯБЛОКО" — то есть слово, которое начинается на "я", будет в самом конце. Если мы попробуем отсортировать словари, мы поймем, что результат сортировки словаря — это список его отсортированных ключей. Поэтому, чтобы нам получить ключ и значение, отсортированные в определенном порядке, то нам нужно с помощью цикла "for" перебрать отсортированные ключи и уже напечатать соответствующие пары, как на примере на слайде.