Top.Mail.Ru
Ответы

Вопрос по Python

s = input()
count = len(s)
i = -1

while count > 0:
i += 1
if s[i] == '[':
s = s.replace(s[i : i + 8], chr(int(s[i + 3 : i + 7])))
count -= 1
print(s)

При введении: Hello, my name is [u-1061][u-1072][u-1082][u-1080]!
Почему-то постоянно выдаёт ошибку. Причём только при несколько раз повторяющихся скобках '['. Как только такая скобка в строке один раз или её вообще нет, ошибки нет.

Текст ошибки:
Traceback (most recent call last):
File "jailed_code", line 7, in <module>
if s[i] == '[':
IndexError: string index out of range

Сижу уже несколько часов, не могу понять проблему. Цикл менял на for, всё равно не работает, я не понимаю почему так... Несколько раз сам проходился, вроде должно работать...
Очень надеюсь на ваше объяснение

По дате
По рейтингу
Аватар пользователя
Новичок
8мес

Конечно! Вот перевод:
Ошибка, с которой вы столкнулись, IndexError: string index out of range, возникает из-за того, что ваш цикл продолжает увеличивать i, даже после изменения строки. Когда вы заменяете подстроку, длина s изменяется, но count остается прежним, что приводит к попыткам доступа к индексам, которые больше не существуют.
Чтобы исправить это, рассмотрите возможность итерации по строке в обратном порядке или измените свою логику, чтобы учитывать изменения в длине после каждой замены. Вот модифицированная версия вашего кода:

1234567
 s = input() 
while '[' in s: 
    start = s.find('[') 
    end = s.find(']', start) 
    if end == -1: break  # Закрывающая скобка не найдена 
    s = s[:start] + chr(int(s[start + 3:end - 1])) + s[end + 1:] 
print(s) 

Эта версия находит и заменяет каждую подстроку в скобках без возникновения ошибок индекса.

Аватар пользователя
Высший разум
8мес

Зачем делать просмотр строки вручную циклом? В Python встроен модуль регулярных выражений:

1234
 import re
s = input()
s = re.sub(r'\[u-(\d+)\]', lambda v: chr(int(v[1])), s)
print(s)