@Generous_Wolf
Учу python

Нужно заменить числа на буквы из алфавита, соответствующие этим числам. Разный результат в программе, как исправить?

Здравствуйте проблема такая, никак не пойму.
Вот задание:
Вам необходимо в строке, полученной со стандартного ввода найти все цифры и заменить их на букву латинского алфавита, располагающуюся по данному индексу (все символы в строке вводятся в нижнем регистре).
Примечание: две цифры не могут располагаться рядом. Те если у вас есть строка «19у» это значит что у вас одна цифра 19, а не 1 и 9. Как результат вы должны получить «sy»
Sample Input:
Hel12o 16e15ple
Sample Output:
Hello people


Вот код.
latin="abcdefghijklmnopqrstuvwxyz"
text = input("Введите строку: ")
i = 0
s = ""

while i < len(text):
    a = text[i]    
    while "0" <= a <= "9":
        s += a
        i += 1
        if i < len(text):
            a = text[i]
        else:
            break
    i += 1    
    if s != "":
        #print(type(s))
        text = text.replace(s,latin[int(s)-1])
    s = ""
    
print(text)


По заданию фразу "Hel12o 16e15ple" выводит так "Hello pe1eple" - правильно меняет буквы из алфавита до пробела, но после пробела почему-то не правильно.
Если же к примеру ввести фразу "12ghj3jhh23" (просто произвольная) - то здесь выдает "lghjcjhhbc" - последние две цифры не воспринимает как число 23 и выводит по буквам "b" и "c".
Если же к примеру поменять 23 на 24: "12ghj3jhh24" - то тут выводит всё как положено "lghjcjhhx" - все правильно заменяет.
В чем может быть проблема? почему не приязнь у программы к числу 23 и пробелам.
Можно как-то подправить именно этот код, без "наворотов", а то я только учусь и еще не вcе понимаю.
  • Вопрос задан
  • 5275 просмотров
Решения вопроса 1
kshnkvn
@kshnkvn
yay ✌️ t.me/kshnkvn
import re
import string

value = 'Hel12o 16e15ple'
for number in re.findall(r'[0-9]+', value):
    value = value.replace(number, string.ascii_lowercase[int(number) - 1])


Вариант без использования регулярного выражения:
import string
from typing import List


def find_numbers(string: str) -> List[int]:
    temp_string = ''
    numbers = []

    for char in string:
        if char.isdigit():
            temp_string += char
        elif temp_string:
            numbers.append(int(temp_string))
            temp_string = ''

    return numbers


value = 'Hel12o 16e15ple'
for number in find_numbers(value):
    value = value.replace(str(number), string.ascii_lowercase[number - 1])


"Поправленный" твой вариант:
latin="abcdefghijklmnopqrstuvwxyz"
text = input("Введите строку: ")
i = 0
s = ""

while i < len(text):
    a = text[i]
    while "0" <= a <= "9":
        s += a
        i += 1
        if i < len(text):
            a = text[i]
        else:
            break
    i += 1
    if s != "":
        #print(type(s))
        text = text.replace(s,latin[int(s)-1])
        if len(s) > 1:
            i -= len(s) - 1
    s = ""


Еще один вариант, близкий твоему, но более правильный:
latin = "abcdefghijklmnopqrstuvwxyz"
text = input("Введите строку: ")

i = 0
s = ""
for a in text:
    if "0" <= a <= "9":
        s += a
        continue
    elif s != "":
        text = text.replace(s, latin[int(s)-1])
    s = ""
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Digara
Проверил , всё работает . Тоже учусь
lat = "abcdefghijklmnopqrstuvwxyz"
text = input('Введите строку: ')
s = ''
i = 0
text_nev = text
while i < len(text):
    a = text[i]
    while '0' <= a <= '9':
        s += a
        i += 1
        if i < len(text):
            a = text[i]
        else:
            break
    i += 1
    if s != '':
        text_nev = text_nev.replace(s, lat[int(s)-1])
        s = ''
print(text_nev)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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