@cehka

Почему в переменную попадает следующий элемент?

Делаю сайт на Django. Создаю сейчас форму для создания постов, и slug(ссылка, типо blog.ru/post/slug), должна генерироваться от title. Я знаю про slugify, но теперь мне нужно перевести Русский в транслит. Нашёл готовое решение:
_capital_letters = {
  u'А': u'A',
  u'Б': u'B',
  u'В': u'V',
  u'Г': u'G',
  u'Д': u'D',
  u'Е': u'E',
  u'Ё': u'E',
  u'Ж': u'Zh',
  u'З': u'Z',
  u'И': u'I',
  u'Й': u'Y',
  u'К': u'K',
  u'Л': u'L',
  u'М': u'M',
  u'Н': u'N',
  u'О': u'O',
  u'П': u'P',
  u'Р': u'R',
  u'С': u'S',
  u'Т': u'T',
  u'У': u'U',
  u'Ф': u'F',
  u'Х': u'H',
  u'Ц': u'Ts',
  u'Ч': u'Ch',
  u'Ш': u'Sh',
  u'Щ': u'Sch',
  u'Ъ': u'',
  u'Ы': u'Y',
  u'Ь': u'',
  u'Э': u'E',
  u'Ю': u'Yu',
  u'Я': u'Ya',}

_lower_case_letters = {
  u'а': u'a',
  u'б': u'b',
  u'в': u'v',
  u'г': u'g',
  u'д': u'd',
  u'е': u'e',
  u'ё': u'e',
  u'ж': u'zh',
  u'з': u'z',
  u'и': u'i',
  u'й': u'y',
  u'к': u'k',
  u'л': u'l',
  u'м': u'm',
  u'н': u'n',
  u'о': u'o',
  u'п': u'p',
  u'р': u'r',
  u'с': u's',
  u'т': u't',
  u'у': u'u',
  u'ф': u'f',
  u'х': u'h',
  u'ц': u'ts',
  u'ч': u'ch',
  u'ш': u'sh',
  u'щ': u'sch',
  u'ъ': u'',
  u'ы': u'y',
  u'ь': u'',
  u'э': u'e',
  u'ю': u'yu',
  u'я': u'ya',}

def transliterate(string):

  capital_letters = _capital_letters
  lower_case_letters = _lower_case_letters

  len_str = len(string)

  translit_string = u""

  for index, char in enumerate(string, 1):
    repl = lower_case_letters.get(char)
    if repl:
      translit_string += repl
      continue
    repl = capital_letters.get(char)
    if repl:
      if len_str > index:
        if string[index] not in lower_case_letters:
          repl = repl.upper()
      else:
        repl = repl.upper()
    else:
      repl = char
    translit_string += repl

  return translit_string


Но не понимаю вот эти строчки:
if string[index] not in lower_case_letters:
Почему в index попадает следующая буква, а не repl?

else:
      repl = char

Зачем нужна эта строчка? Ведь сначала мы проверили на нахождении буквы в lower, а иначе в capital, получается эта строчка вообще никогда не выполняется?

Заранее большое спасибо.
  • Вопрос задан
  • 99 просмотров
Решения вопроса 1
MaxLevs
@MaxLevs
for index, char in enumerate(string, 1):

Нумерация массивов в Python начинается с 0.
Ты задаешь начальное значение нумерации значений из массива явно, поэтому index всегда ссылается на следующий элемент строки.
arr = ["a", "b", "c", "d"]
enumerate(arr, 7) # {7:"a", 8:"b", 9:"c", 10:"d"}


P.S. Код, действительно, не лаконичный. В комментах к вопросу sim3x кинул неплохой вариант.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы