[ЗВУК] Итак, посмотрим, когда же можно и для чего использовать словари. Самое первое применение — это использовать словарь по прямому назначению. Мы уже на это посмотрели, например, когда создавали наш словарь со столицами. Второе — это подсчет числа объектов, то есть сколько раз у вас какой объект встретился. Давайте научимся решать эту задачу. Например, сделаем такую простую вещь: посчитаем количество вхождений каждой буквы в нашу строку. То есть мы ее считываем с клавиатуры: что пользователь ввел, для того мы и посчитаем. И хотим считать разные буквы: сколько раз они встречались. Сначала у нас словарь пуст, он будет содержать в себе такие пары ключ-значение: ключом будет буква, а значением — сколько раз она встретилась. Если совсем у нас нет этого ключа, значит буква не встречалась в нашей строке. Итак, создали пустой словарь, теперь пройдемся по нашим буквам, нашей строке. Как здесь нужно поступить? Если буква уже встречалась, то что нужно сделать? Нужно увеличить то значение, которое там есть, на 1, то есть она встретилась еще один раз. В противном случае у нас такого ключа еще нету в нашем словаре, поэтому его нужно создать. И встречалась она один раз. Вот такая конструкция. Давайте напечатаем наши пары ключ-значение, но сделаем это красиво с помощью цикла. Значит, буква у нас перебирается, и мы печатаем пару: буква, сколько раз она встретилась. И часто нужен делать так, чтобы у нас ключи шли по возрастанию, то есть они были упорядочены. Есть очень простой способ это сделать — воспользоваться sorted. Ну и посмотрим, можно ли так хитро поступать. Так, от нас ждет строку, давайте введем какую-нибудь простенькую. hello — вот у нас вывелось, и, насколько я знаю английский алфавит, даже в алфавитном порядке. Значит, когда мы берем просто letters в нашем случае, название нашего словаря, у нас перебираются все ключи в случайном порядке. Функция sorted умеет принимать что угодно итерируемое, например вот этот iterable объект — ключи словаря, и возвращать отсортированный список. То есть мы идем по отсортированным ключам и берем из словаря значения, им соответствующие. Как можно упростить эту программу? В принципе, она и так достаточно простая, но можно сделать еще проще. Как это делается? Смотрите, во-первых, мы можем избавиться от некоторых if'ов, else'ов, по крайней мере от одной ветки. Давайте сделаем так: если у нас буква пока еще не встречалась, то есть у нас ключ not in словарь, не в словаре, то мы положим туда 0. Она встретилась только что, мы положили 0, и теперь, когда мы после этого if окажемся, мы либо в него входили, либо не входили, но в любом случае наша буква уже в словаре есть, и поэтому мы можем прибавлять 1 безусловно. Посмотрим, что это не сломалось, одну строчку мы уже выкинули из нашей программы, и она продолжила работать. Поскольку такая задача возникает достаточно часто, то в словарях предусмотрен метод get с двумя параметрами. Сейчас я расскажу, что он делает. Итак, что мы хотим сделать? Мы хотим в наш letters от буквы, количество вхождений, положить старое значение, то есть что там было, сколько уже было посчитано таких букв. А если не было, то подставим туда 0, и к этому прибавить 1. Итак, метод get принимает два параметра: ключ, для которого нужно вернуть значение, и значение, которое нужно вернуть, если такого ключа не нашлось. То есть что мы делаем? Мы узнаем, сколько раз уже встречалась такая буква, а если ее вообще не было в словаре, то у нас получается значение 0. И к этому всему мы прибавляем 1. Давайте опять проверим. Все работает. То есть вот такой способ пользоваться подсчетом у нас имеет очень короткую запись всего в одну строку вместо четырех, как мы написали изначально. Пользуйтесь им с удовольствием, но если забудете, ничего страшного, если вы напишете более сложно — люди все равно смогут прочитать и понять, что у вас там написано. Как вообще исследовать какие-то новые объекты, если у вас установлена нормальная среда программирования? Вот мы узнали, что такой есть словарь, и смотрим, что же оно такое вообще умеет делать. copy, clear, fromkeys, get, items — в общем, достаточно много методов. Все из них полезны в каких-то разных ситуациях. Как их изучить? Смотрим название, идем в поисковик, пишем: Python, третья версия, чтобы не путаться на всякий случай, Python 3, dict — название словаря, и затем метод, который нам интересен. Ну и получаем, в общем-то, исчерпывающую какую-то документацию или описание на каком-то стороннем сайте и узнаем, что этот метод делает. В общем-то, из названия чаще всего понятно, что он делает, но для уточнения, для каких-то приемчиков можно так поступать. Мы уже разбирать все не будем, потому что их много и способ, как узнать о них, понятен. Когда еще используются словари? Напомню: по прямому назначению и подсчет. Еще, на самом деле, словари используются для хранения каких-то разреженных массивов. В демонстрационном ЕГЭ по информатике уже достаточно много лет назад была такая задача, которая часто разбиралась многими авторами, как ее решать. Задача была о подсчете минимальной цены бензина, то есть там были заправки, где продавался 92-й, 95-й и 98-й бензин, например. На каждом была известна цена и нужно было сказать минимальную цену для каждого типа бензина. В том числе предлагались разные хитрые способы хранения, то есть за хранение огромного списка, где есть индекс от 0, например, до 98 включительно — там снимались какие-то баллы, в этом ЕГЭ, говорили, что люди неэффективно используют память, большая часть элементов не используется. И люди придумывали разные конструкции, например, вычитать из марки бензина 92, переводить это тогда в 92-й, превращается в нулевой, а 95-й — в третий, а 98-й — в шестой, и это как-то делить на три, в общем, и сохранить в массив числа 0, 1, 2. Это, конечно, очень запутывает читателя и вот эта вот экономия на спичках, на байтах — она ни к чему хорошему не приведет. В этом случае использование словаря очень хорошо подходит для решения этой задачи. То есть мы можем создать словарь, который будет, собственно, эту цену бензина и хранить. Например, в нашей задаче задано количество заправок, и затем тройки чисел — стоимость бензина на этой заправке. Давайте это все и считаем. Как мы это сделаем? Давайте подумаем. Поскольку мы ищем минимумы — мы уже знаем, как делать, — мы должны отдельно разложить минимумы по первое значение. То есть мы считываем отдельно первый элемент последовательности и запоминаем его как минимальный. В нашем случае у нас нужно хранить три минимума для каждого типа бензина, поэтому мы считаем первый элемент нашей последовательности отдельно, а все остальные — отдельно. Итак, пусть они у нас даются в одну строку. Вот у нас первые три числа. Как мы разложим их? В стоимость 92-го бензина мы положим с ключом 92, стоимость 95-го с ключом 95, ну и по аналогии — с ключом 98. Вот. Ну и затем мы просто будем точно так же считывать очередную тройку чисел и раскладывать их по нашим элементам словаря, то есть сравнивать каждый из них с текущим заполненным минимумом. Это можно сделать, например, с помощью стандартной функции min вот примерно таким образом. На самом деле, конечно, все это можно было сделать намного красивее — сейчас я писал как такой очень-очень средненький школьник, пишущий ЕГЭ по информатике. такой не увлекающийся всерьез. Букв много, повтором, как вы видите, очень много, то есть я беру пользуюсь Copy-Paste и правлю что-то. Вероятность ошибиться при этом огромна — где-то я мог забыть, где-то что-то перепутать. Вот я уже даже нашел случайно одну ошибку, а мог и не найти. Ну и теперь мы можем все это напечатать. Вы спросите: а зачем здесь какой-то словарь? Зачем здесь еще что-то? Можно было создать три отдельных переменных. И, действительно, так оно и есть — никакой словарь при таком способе решения не нужен. Давайте проверим, что хотя бы мы смогли такой школьный код написать правильно. То есть хотя бы здесь не ошибиться. Пусть у нас есть две заправки, на первой, значит, бензин стоит 2, 3 и 4 рубля — довольно дешевый. Почему он не работает? Потому что я оставил какие-то остатки предыдущих программ. Итак, у нас есть, значит, две заправки: одна с дешевым бензином. И опять не работает. Почему? Как хорошо, что у меня, в отличие от школьников на ЕГЭ есть компьютер, на котором можно запустить и проверить программу. Мелкие ошибки всплывают. Если вдруг вы школьник и готовитесь к ЕГЭ, то пока что на момент записи курса ЕГЭ писался на бумаге, поэтому вам нужно учиться еще такому мастерству. Итак, пусть у нас наша вторая заправка предоставляет скидочки на более качественный бензин. Смотрите, вот он метод Copy-Paste — одна ошибка копируется во все места. Исправляем ее наконец. И получаем, надеюсь, уже работающую программу. Неработающую. Почему? Потому что числа были целые. И такая невнимательность, такое копирование, как вы видите, даже у меня, достаточно опытного в этом написании программ человека, вызывает кучу ошибок. Вот мне удалось раза с пятого, наверное, добиться какого-нибудь работающего кода. Таким образом, использование даже умных структур, бездумное, приводит к проблемам. Ну а как решить эту задачу более красиво, мы посмотрим в следующем видео. [ЗВУК] [ЗВУК]