[МУЗЫКА] [МУЗЫКА] Итак,
мы научились выводить похожий на правду словарь.
Правда, не в том формате, как нам нужно.
Давайте теперь сделаем это все красиво.
Как это будет делаться?
Во-первых, мы должны отсортировать ключи по алфавиту.
Покажу еще раз входные данные.
Наши выходные должны быть в том же формате.
Здесь у нас все ключи отсортированы по алфавиту.
Делается это очень просто.
Мы уже так делали.
То есть мы сейчас перебираем латинское слово в нашем словаре.
Вот так мы переберем ключи в случайном порядке.
Чтобы было в отсортированном, просто пользуемся sorted.
И получаем список отсортированных ключей.
Давайте напечатаем пока что в целях посмотреть, как оно делается.
Да, это похоже на алфавитный порядок.
Кроме того, что у нас должно быть напечатано латинское слово,
нам нужно напечатать еще его переводы.
Сейчас я покажу, как это сделать очень-очень кратко.
Мы должны поставить значок тире, окруженный пробелами.
Давайте пока пробелы не будем ставить, будем пытаться расставить запятые таким
образом, чтобы у нас пробелы сами поставились, где нужно.
Значит, для каждого латинского слова мы должны вывести все его переводы на
английский язык через запятую.
Как мы это сделаем?
Воспользуемся методом join, который использует строку в качестве разделителя.
То есть у нас все слова будут разделяться запятой и пробелом.
К этому разделителю вызывается метод join.
И ему передается список строк, которые нужно объединить.
Где у нас лежит наш список строк?
В нашем словаре для латинского слова, которое мы знаем.
Давайте посмотрим, как это работает и что у нас получится, красиво или нет.
Да, отлично, получилось!
Даже получилось красиво — ровно так, как нужно.
Но то, что оно работает правильно, — это случайность в нашем случае.
Почему?
Потому что наши слова требуется отсортировать по алфавиту,
то есть все переводы.
И то есть если переводов несколько, они в алфавитном порядке должны идти.
У нас всего одно слово, где есть два различных перевода.
И они отсортированы.
Но это, как я уже говорил, полная случайность,
потому что порядка никакого нет.
Как у нас они задавались, так они и сохранятся.
Кстати, давайте подумаем, может ли быть это не так?
Давайте попробуем испортить.
Если бы входные данные были не в алфавитном порядке,
то, наверное, это могло бы и не работать.
Давайте проверим.
[БЕЗ_ЗВУКА] Кажется, я что-то сломал?
Я вставил лишнюю пустую строку, и от этого программа перестала работать.
Да, вот смотрите, если у нас входные данные были бы перечислены не
в алфавитном порядке, то мы бы получили неправильный порядок.
Но тем не менее если хорошо-хорошо все обдумать и воспользоваться тем,
что у нас входные данные в алфавитном порядке идут, то можно понять, что у нас,
поскольку мы кладем в список слова, то они всегда окажутся в алфавитном порядке.
Но что делать,
если мы не хотим думать и доказывать это строго или боимся ошибиться?
Пишем: sorted.
И уже никогда не ошибаемся.
Теперь, в каком порядке бы ни было задано, у нас всегда всё будет работать.
Конечно, сортировать для уверенности уже отсортированные данные — это плохая идея.
Но в каких-то сложных случаях, когда непросто понять,
что данные уже будут отсортированными, допустимо такое действие.
Вот здесь мы не хотели думать и отсортировали,
и наша программа стала работать не только для входных данных,
но и для некорректных входных данных, где не по алфавиту перечислено.
Тем не менее работать для настоящих входных данных она не перестала,
и затраты времени не очень велики.
Посмотрим еще одно не очень очевидное применение словарей,
когда можно эти словари применить.
Например, для хранения генеалогического древа.
То есть если вы или не вы, а кто-то еще,
для кого-то вы делаете его генеалогическое древо, хотите от Рюрика
проследить свое или не свое древо,
как ваши предки на много-много
поколений, в каких родственных связях они состояли.
Итак, что мы можем сделать?
Мы можем воспользоваться словарем для этого,
указывая в качестве ключа прародителя, а в качестве значения используя,
опять же, словарь, каждый из элементов которого, в свою очередь,
будет таким маленьким генеалогическим древом.
То есть если вы возьмете, начиная с какого-то момента,
это тоже генеалогическое древо, только поменьше.
То есть, например, у нас человек с именем a родил, например,
детей с именем b — бездетных, например, пока что.
Тогда мы сопоставляем пустой список.
И, например, еще ребенка c, у которого, в свою очередь, тоже были какие-то дети.
Ну, например, у него ребенка звали d, и он еще маленький, у него нет детей.
И у него, например,
звали ребенка e, который тоже еще маленький,
потому что иначе у нас все это очень сильно разъедется.
Вот я что-то написал, и абсолютно ничего не понятно.
Как это сделать более понятно?
Словари можно задавать в нескольких строчках.
То есть просто воспользоваться переносами строки.
И теперь давайте посмотрим, как это будет выглядеть.
Значит, наведем красоту.
Наша красота наводится, например, вот таким способом.
Вот.
И закрывающие фигурные скобочки расставим там, где это положено.
Смотрите, редактор нам очень помогает в этом деле — он делает почти все правильно.
То есть мы немножко поможем ему.
И вот такую конструкцию уже читать намного проще.
Смотрите, у нас каждый уровень вложенности нашего генеалогического дерева
находится с отступом определенным.
А если, например, у нас у человека было несколько детей,
то они находятся с одним и тем же отступом и перечислены.
То есть вот у нас наши дети.
Смотрите, я немножко напутал.
Почему?
Потому что у нас бездетные люди создают некоторую проблему с отступами.
Вот теперь, наконец, настала красота!
Почти настала красота.
Вот!
Вот теперь хорошая конструкция!
Смотрите, у нас каждые дети, каждый очередной слой находится на своем уровне.
Ну и какая-то логика в расстановке отступов тут присутствует.
И теперь это уже понятно, что вообще такое.
Обращаться к элементам дерева приходится достаточно хитро,
но вы можете написать, например, рекурсивную функцию, которая принимает
на вход очередной словарь, перебирает все ключи этого словаря — это дети.
И для каждого ребенка, например,
вызывает себя и что-нибудь полезное с этим генеалогическим древом делает.
Например, для каждого человека распечатывает полную его историю от
корня этого дерева.
Таким образом, словари можно использовать в качестве структуры данных для хранения,
в общем-то, любых деревьев, не только генеалогических.
Это могут быть и какие-то конструкции для
обработки данных, чаще всего бинарные деревья применяются.
И, в принципе, словари для их хранения тоже подходят,
хотя в этом случае лучше воспользоваться списками.
[МУЗЫКА]
[МУЗЫКА]