[МУЗЫКА] [МУЗЫКА] Итак,
вот у нас наконец-то сработавший, но не очень качественный код.
Мы хотим придумать, как решить эту задачу все таки, используя преимущество словарей,
а не фактически используя три переменные, как это сделано сейчас.
Что мы можем сделать?
Ну, например,
мы можем перебирать
наши марки бензина, записав их в кортеж и сохранив его.
Для этого мы сделаем следующую вещь:
мы считаем просто в Iterable с помощью map 3 числа,
у нас там окажется цена 92-го, 95-го, 98-го бензина,
и переберем тип бензина просто в кортежике.
Ну вот уже стало несколько красивей.
Итак, значит, перебираем тип бензина.
Мы должны брать очередной элемент,
но чего-то ничего хорошего пока не наблюдается в этой идее.
Давайте запишем типы бензина в отдельном кортеже.
Теперь переберем все
наши типы бензина, индексы элементов.
Почему?
Потому что у нас цены записаны как индексы,
для этого сделаем списочек, и типы записаны как индексы.
Теперь, вот теперь мы можем сделать уже
сопоставление очередного типа бензина.
Для этого нужно взять наш словарь с ценами, тип и
для типа номер,
и туда положить ну, собственно, такую же по номеру считанную цену.
Пока получилось длиннее,
но это нам здорово облегчит жизнь при повторном использовании.
То есть, что мы все-таки, вынуждены копировать это
и сделать одну маленькую поправку.
Выбирать минимум из текущего значения и нового считанного.
Ну вот, такой код переделанный уже выглядит все-таки, несколько лучше.
И главное – он намного универсальнее.
Если бы у нас добавились еще, там, десяток типов бензина,
то предыдущий код был бы совсем плох, потому что нам пришлось бы добавлять, там,
20 строк в него для 10 типов бензина.
Здесь же ничего практически не меняется.
Если мы немножко еще напишем красивее,
то у нас совсем все становится просто.
Мы сможем просто в одно место, кстати почему в одно,
у нас пока что в двух, потому что одно из них лишнее.
В одном место добавить новые типы бензина и все будет хорошо.
Ну, давайте посмотрим, что...
уж в этот раз мы написали более приличный код.
Да, все по-прежнему работает, ну и код стал намного лучше.
То есть вот так словари помогают хранить разреженные массивы.
В принципе, эта задача очень похожа на подсчет числа вхождений,
но имеет немного другую суть.
Перед тем как порешать задачи первого типа, использования
словаря по непосредственному его предназначению как словаря,
посмотрим, что мы можем делать хорошего со строками.
Со строками мы можем делать массу интересных операций,
которые облегчают нам жизнь.
А именно, например, мы можем проверить состоит ли строка только
из латинских, ну или не латинских, букв.
Что мы для этого сделаем?
Мы напечатаем значения вот такого метода, примененного к строке isalpha.
Является ли строка буквенной строкой.
Ну давайте быстренько проверим, вот строка,
содержащая буквы, isalpha.
Вот у нас есть некоторая строка, содержащая буквы, для нее true.
Если строка содержит что-нибудь другое, то это уже не true.
Ну вот, например, знаки препинания.
Да, это false.
А давайте для интереса проверим, а пробелы как она воспримет.
Тоже воспринимает как false.
То есть такой метод позволяет проверить,
состоит ли строка только из букв или не только.
Что еще бывает полезного, методы...
я уж сейчас не буду каждый из них отдельно проверять,
isalnum – буквы и цифры; isdigit
– цифры,
только цифры; islower – только
маленькие буквы; isupper – только большие буквы.
Кстати, есть методы lower и upper, которые переводят,
соотвественно, строку в маленькие и большие буквы, верхний и нижний регистр.
Ну и мы уже немножко смотрели,
метод strip позволяет обрезать пробельные символы по краям.
Также у него есть две модификации: lstrip (обрезать только
слева) и rstrip (обрезать и слева, и справа).
Вот такие методы позволяют нам эффективно работать со строками,
что часто очень пригождается в задачах на словари, на какую-то обработку текстов.
Ну, мы можем достаточно быстро все там лишнее обрезать, проверять и так далее.
Теперь решим такую задачу.
У нас есть англо-латинский словарь,
где английскому слову сопоставляется его латинский перевод.
Нам по нему нужно сделать латино-английский словарь.
Я заранее подготовил файл, в котором можно посмотреть, как выглядят входные данные.
Английское слово – пробел – тире – латинские слова через запятую.
Нужно точно в таком же виде вывести латино-английский словарь,
то есть упорядоченный по алфавиту,
и сопоставляются уже латинскому слову английские слова.
Ну вот как здесь malum (я не очень силен в произношении латинских слов) одновременно
соответствует двум английским словам.
Внутри они также должны быть отсортированы по алфавиту.
Как мы видим, во входных данных это свойство выполнено.
Вот такая вот конструкция.
Воспользуемся файлами.
Почему?
Потому что мы заранее не знаем, сколько там будет строк, нам там будет удобнее.
Обратите внимание, в open можно пропускать режим чтения, по умолчанию он r,
ну, собственно, чтение, то есть режим открытия файла.
И кодировку тоже, естественно, можно пропускать.
То есть вот такая штука позволяет нам читать из файла просто,
чтобы меньше писать.
Будем перебирать все строки файла.
Наша строка, напомню,
состоит из английского слова – пробел – тире – пробел, и латинских слов.
Что нам нужно сделать?
Нам нужно каким-то образом вычленить английское слово, латинские слова.
Способов сделать это – много.
Давайте воспользуемся, может быть не самым красивым, но достаточно простым.
Сначала разрежем нашу строку на список, состоящий из двух строк:
английского слова и всех остальных латинских (eng, latins).
Для этого мы берем очередную строку и сплитим ее по тире.
Слева окажется английское слово, справа – латинские.
Латинские слова мы тоже можем нарезать по запятым.
То есть строку теперь latins
посплитить по нашим запятым.
Значит, что у нас здесь будет происходить?
Ну давайте мы воспользуемся пустой командой pass и посмотрим на отладке,
как это все выглядит.
Вот оно у нас показывает,
какое там содержимое.
Смотрите, у нас есть пробелы какие-то, переводы строк лишние и так далее.
Здесь пробел – после.
В общем, что нужно сделать?
Нужно для всего сделать стрип.
То есть мы берем старое значение и все обрезаем.
Перебираем все элементы
нашего списка и
добавляем туда правильные
элементы.
То есть в новый список уже чистенький, порезанный,
почищенный добавляем чистенькое,
обрезанное слово безо всяких пробелов, переводов строк и всего такого.
Все, теперь мы можем надеяться, что у нас все красиво.
Что нужно сделать дальше?
Нам нужно каждому латинскому слову,
которое у нас было переводом этого английского слова,
в обратном словаре добавить это английское слово в качестве значения.
То есть, вот наш словарь, вначале он пуст,
а теперь вместо того, чтобы добавлять в какой-то новый
список очередное чистое латинское слово, мы будем сразу в словарь кидать.
То есть вот это я удаляю и в словарь, уже латино-английский,
мы добавляем английское слово.
Кстати, это не добавление.
Это у меня один к одному будет сопоставление.
Что нужно делать?
Нужно добавлять его в список.
То есть, когда у нас несколько значений, мы используем всегда списочек для этого.
Что мы делаем?
Если у нас слово не в словаре,
мы делаем пустой список в соответствующем этому слову.
Но смотрите, здесь много раз вызван один и тот же метод,
конечно лучше было бы придумать что-нибудь более хитрое.
Теперь у нас список обязательно есть и мы добавляем
очередное наше английское слово.
Давайте напечатаем и посмотрим, получилось ли у нас что-нибудь,
похожее на латино-английский словарь или нет.
Посмотрите, действительно что-то есть, и даже вот у нас есть два слова.
Пока это некрасиво, но как сделать это красиво,
мы посмотрим в следующем видео.
[МУЗЫКА]
[МУЗЫКА]