@nak-alexey

Транслитер, где ошибка?

Делаю переводчик, задача которого русский текст написанный на латинице перевести в русский. Цикл останавливается только на первом совпадении т.е. выводит в консоль "ja", где я допустил ошибку? Или чего не хватает?
def transliterate(name):
    dictionary = {'a':'а','b':'б','v':'в','g':'г','d':'д','e':'e',
      'zh':'ж','z':'з','i':'и','y':'й','k':'к','l':'л','m':'м','n':'н',
      'o':'о','p':'п','r':'р','s':'с','t':'т','u':'у','f':'ф','kh':'х',
      'ts':'ц','ch':'ч','sh':'ш','shch':'щ','ъ':'','ie':'ы','ь':'','ei':'э',
      'yu':'ю','ja':'я'}

    i=0

    while i<len(name):
        for key in dictionary:
            index = 1
            while (index!=4):
                if (name[i:index] == key[0:index]):
                    print(name[i:index] + ' = ' + key[0:index])
                    index+=1
                else:
                    index=4
        i+=1

transliterate("jayu")
  • Вопрос задан
  • 110 просмотров
Решения вопроса 2
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
В срезах. Обе границы среза должны указываться абсолютно, а у вас индекс сбрасывается в 1 каждый раз. Такой изнаночный срез будет возвращать пустую строку.
"abcdef"[3:2] -> ""
Ответ написан
SoreMix
@SoreMix Куратор тега Python
yellow
Вы каждый раз сбрасываете index , при этом i остается большой. Соответственно, срез получается от большего числа к меньшему.

Я бы сделал как-то так
def translit(name):

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

    end_index = 0
    start_index = 0

    while start_index < len(name):
        last_match = ''
        while end_index < len(name)+1:
            if name[start_index:end_index] in dictionary:
                last_match = name[start_index:end_index]

            end_index += 1

        print(last_match, '=', dictionary[last_match])
        
        start_index += len(last_match)
        end_index = 0
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
IDzone-x
@IDzone-x
Костыли сила паттерны могила
Один вопрос почему вам нежен такой сложный алгоритм транслейтера если можно зделать проще?:
def transliter(string):
  l_dict = {'a':'а','b':'б','v':'в','g':'г','d':'д','e':'e',
      'zh':'ж','z':'з','i':'и','y':'й','k':'к','l':'л','m':'м','n':'н',
      'o':'о','p':'п','r':'р','s':'с','t':'т','u':'у','f':'ф','kh':'х',
      'ts':'ц','ch':'ч','sh':'ш','shch':'щ','ъ':'','ie':'ы','ь':'','ei':'э',
      'yu':'ю','ja':'я'}
  translit_string = []

  for char in string:
    translit_string.append(l_dict[char])
  return "".join(translit_string)
  
  
print(transliter("opa")
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы