Часто при работе с данными необходимо выполнять замены значений по списку или словарю. И обычно первое решение, которое приходит на ум, - это замена с использованием циклов.
Но, оказывается, есть и др. способ провернуть эту задачу.
В показанном примере необходимо подсчитать сумму очков за каждую букву введенного слова пользователем.
Слово может быть введено на русском или английском языках. Очки распределяются от 1 до 10 в зависимости от буквы.
Допустим, есть некий список букв и очков, которые начисляются за каждую из них (назовем его "карта значений").
Будем использовать следующий подход: каждую букву меняем на цифру (количество очков), но возникает проблема с разделением разрядов и букв, т.к. может получиться ЖУК->522.
Замену будем проводить через регулярные выражения с использованием групп (?P<name>...). Название группы будет равно количеству очков за набор букв, но наименование группы не может начинаться с цифры.
Решение указанных проблем: в названии групп добавить одинаковые буквы. Например, 1 очко - группа s1, 2 очка - группа s2 и т.д. А в конце заменить буквы s на плюс + и подставить строку в eval() для финального подсчета.
Вот здесь: scores=eval(p.sub(callback,wrd).replace('s','+'))
Теперь подробнее.
Карту значений запишем в формате регулярных выражений (?P<name>...), где:
- name - это название группы, а по сути то, на что хотим заменить каждую букву: количество очков. По этому имени можно ссылаться в последующей схеме регулярки на эту группу;
- ... - набор данных, который записывается по правилам регулярных выражений. Это как раз то, что мы хотим найти и заменить на name. В нашем примере мы указываем набор букв через | (или): 1 очко - (?P<s1>А|В| и т. д.)
Далее в игру вступает... функция обратного вызова callback.
Функция обратного вызова передается как аргумент для другой функции, которая будет вызывать callback функцию каждый раз в своем определении.
Обычно такие операции выполняются с асинхронными функциями.
Через callback функцию мы забираем название каждой группы как последнее (mobj.lastgroup) и заносим в результат обработки регулярного выражения - объект p аля pattern.
Подставляем все в финальную строку нашего выражения и вычисляем через eval() с заменами: scores=eval(p.sub(callback,wrd).replace('s','+')).
Какое выражение появится в eval().
Подписка и лайк - это стимул для нас работать ещё лучше.
Пожалуйста, поддержите нас!
#алгоритмы #секреты #питон #технологии #нестандартныерешения #python3 #python #программированиенаpython