Мы с вами поговорили о еще одном неупорядоченном типе данных — это словарь, и обсудили, что словарь удобно использовать, когда нам нужно хранить какие-то элементы парами. Например: слово и его перевод в словаре, название продукта и его цена в базе данных магазина, имя человека и его телефон в записной книжке. Словари как раз будут помогать нам решать такие задачи, когда по одному элементу нам нужно быстро и легко найти второй, который ему соответствует. Давайте попробуем решить задачу перевода. У нас пользователь будет говорить, какое слово его интересует, а мы будем выдавать ему перевод. Попробуем сначала такую задачу решить без словарей, со списками. У меня есть список "eng", в котором у меня хранятся слова на английском языке, и список "rus", в котором хранятся эти же слова, но на русском. Соответственно, списки соответствуют друг к другу, и элемент нулевой списка "rus" является переводом нулевого элемента списка "eng". Мы будем у пользователя спрашивать перевод какого слова ему нужен и находить это слово в словаре, если оно там есть, выводить перевод. Мы уже умеем решать задачу сопоставления двух списков одинаковой длины. Для этого мы используем конструкцию "for i in range", длина списка "len eng", мы запускаем этот цикл и будем проверять, является ли слово под индексом "I" тем словом, которое нужно пользователю. Если это то слово, которое его интересует, будем печатать перевод этого слова на русский. Слово из списка "rus" под этим же индексом. Давайте проверим, что работает. Например, слово "apple" — яблоко. Давайте теперь какое-то слово, которого нет, "python", да, ничего не произошло, потому что такое слово не нашлось, мы ничего не вывели. Такую задачу конечно можно решить с помощью списков, но мы сейчас убедимся, что с помощью словарей это сделать проще. Давайте сначала поговорим про то, как словарь у нас выглядит, как он отличается от множества и как его создать. Во-первых, мы с вами всегда говорим про то, как создать пустой тип данных. Давайте, например, создадим пустой словарь. Пустой словарь можно создать фигурными скобками, мы как раз говорили с вами про то, что здесь, внимательно, пустые фигурные скобки создают нам пустой словарь, не пустое множество. Либо пустой словарь можно создать с помощью функции "dict", который называется так же, как тип данных, не передав ей никаких аргументов, тоже будет пустой словарь. Давайте проверим, как называется тип данных, чтобы наверняка. Да, тип данных "dict", точно так же как функция. Как отличить множество от словаря? Да и там и там фигурные скобки, и там и там мы перечисляем элементы через запятую, но в словаре элементами является пара. Если мы просто, например, я перечисляю строки через запятую внутри фигурных скобок, я получу множество, если я внутри скобок через запятую перечислю пары, например, "apple — яблоко, hello — привет" и так далее, то я получу словарь. Чтобы дать сигнал, что мы хотим какие-то элементы хранить парами, между этими элементами мы ставим двоеточие. Проверяем. Итак, "eng" у меня множество, Python это видит, как класс "set" — множество, и "eng rus" — это словарь, Python его видит как словарь. Все корректно, да. Поэтому здесь внимательно перечисляем просто элементы в фигурных скобках, получим множество, перечисляем пара элементов через двоеточие в фигурных скобках получим словарь. Давайте решим нашу задачу перевода теперь со словарями. Давайте точно также будем у пользователя спрашивать какое слово мы переводим, и печатаем перевод этого слова. Смотрите, наша задача, я вернусь к началу, она здесь занимала четыре строчки, а теперь уместилась в две. Мы спрашиваем слово и мы его выводим. Словарь не упорядоченная структура данных, со словарем не работает индексация, у него нету нулевого, первого, второго элемента, они не закреплены за соответствующими индексами, но в словаре мы можем по элементу, ключу, который идет до двоеточия, первая часть пары, обратиться к элементу значение, которое соответствует этому ключу. Например, "apple" — это ключ, а "яблоко" — это значение. Соответственно, если я вызываю в этом словаре, я вызываю ключ "apple" и получаю его значение. Мы видим, что с помощью словаря задачу перевода очень легко решать. Давайте еще раз, без переменной, проверим как это работает: здесь будем "apple" переводить, здесь я в переменной "word" сохранила слово "яблоко" на английском, здесь я его ввела просто как строку и здесь, и здесь я по ключу смогла обратиться к значению, которое этому ключу соответствует. Очень похоже на то, как мы в списке по индексу обращались к элементам. Давайте посмотрим, что будет, если попробовать обратиться к какому-нибудь слову, которого в словаре нету. Мы выше пробовали это со списками, и программа просто ничего не выводила. Давайте тоже "python" — получили ошибку. Ошибка у нас называется "keyerror" (ошибка ключа) и такая ошибка значит, что в вашем словаре нет такого ключа. Поэтому, если вы обратились к несуществующему ключу, всегда получите ошибку. Похожую ошибку мы получали со списками, когда пытались обратиться к индексу, которого в списке не существует, но в нашем словаре мы можем делать проверку. Например, я с помощью оператора "in" могу проверить входит ли строка "python" в мой словарь. False. "python" в словарь не входит. Значит это будет ложь, или могу сделать проверку наоборот, что "python" не входит в словарь и будет истина, потому что "python" действительно в словарь не входит. Обратите внимание, что эта проверка с оператором "in", в случае со словарями, проверяет только ключи. Если я введу какое-то слово, которое у меня есть в значении, например, давайте "яблоко" на русском. "Яблоко" — значение, оно есть в моем словаре, но если я сделаю эту проверку, "яблоко" не в словаре будет истина. Соответственно, "яблоко" в словаре будет ложь. С точки зрения Python "яблоко" в словаре нет, потому что эта проверка работает только с ключами. Таким образом, мы только можем проверить, что какой-то ключ есть в словаре, значение она не проверяет. Давайте добавим в нашу программу интерактивность. Теперь мы будем проверять, что какое-то слово есть или его нету, чтобы не было ошибки. У нас будет два словаря, будем переводить с русского на английский и с английского на русский. Также будем вводить слово "if word" есть в англо-русском словаре, будем выводить его перевод, обращаясь к значению, к переводу по ключу, по английскому слову. Давайте проверим на этом этапе, что работает. Да, работает. Если слова в английском словаре нет, давайте проверим, что может быть это слово на русском, потому что там не должно было быть. Если слово "in rus eng" во втором нашем словаре, если оно является ключом в этом словаре, тогда печатаем его перевод на английском, а если такого слова нет ни в одном из словарей, давайте печатать, что такого слова нет. Вот теперь у нас две проверки, и третье условие, если слово не никуда не попало. Давайте проверим. Ключ "apple" есть, получили перевод "яблоко". Теперь давайте что-нибудь на русском, что тоже есть в нашем словаре. Например, слово "привет". Слово "привет" есть, вот здесь проверка не прошла, потому что оно не входит в значение, в ключе этого словаря, а здесь проверка прошла, потому что "привет" входит в ключ словаря русско-английского. И давайте код слова которого нет. Пусть это будет опять "python", такого слова нет. Все работает. Наша программа интерактивная и нахождение перевода слова гораздо проще, чем в том случае, когда мы решали это с двумя списками. Давайте еще буквально два слова скажем про то, что может быть ключом, а что может быть значением в словаре. Ключом может быть любой неизменяемый тип данных. Из того, что мы знаем это: строки, кортежи, числа (целые, вещественные) и логические переменные. Конечно, наверное, логическая переменная и кортеж редко нам будут встречаться в качестве ключей, но на всякий случай будем знать, что это возможно. Представим, что наш словарь здесь переменная ключ какая-то, например, "true 1, 5.3" — кортеж, а значением будет как раз тип этой переменной. Запускаю, все работает, нет ошибки. Соответственно, ключами могут быть любые неизменяемые данные, а значениями могут быть данные совершенно любые. Например, вот здесь у меня пример словаря в котором ключи — строки, а значения — целые числа. Предположим, это у нас дневная температура: утром, днем, вечером и ночью. Все работает и красиво выводится. Еще один момент. Давайте вернемся к этому словарю. Обратите внимание, у меня здесь единица была ключом, и вот такая запись: "types dict один" очень похоже на индексацию списка, у меня сработала, но это не значит, что в моем словаре внезапно начала работать индексация. Давайте попробуем вызвать элемент "types dict ноль", ведь если бы у нас был список, в котором был бы первый элемент под первым индексом, у нас бы обязательно был элемент под нулевым индексом. Все еще ошибка "keyerror", ключа ноль нету. Итак, когда мы здесь обращались к единице, ошибки не было, потому что в нашем словаре действительно есть ключ единица, это не индексация, это обращение к ключу словаря, который тоже является целым числом. Такое может быть, но это не значит, что с нашими словарями может работать индексация, а не в первую очередь не упорядочение типа данных. Дальше мы поговорим как работать со словарями, как перебирать их в цикле и отдельно работать с ключами и значениями.