#python #stringindexoutofbounds
#python #stringindexoutofbounds
Вопрос:
Есть какая-то проблема с моим кодом на Python. Я создаю программу, которая находит вхождения буквы A
в слове, и если эта буква найдена, а следующая буква не является буквой, A
то A
она заменяется следующей буквой.
В качестве примера можно привести TAN
бытие TNA
, но WHOA
остающееся WHOA
AARDVARK
бытием ARADVRAK
Проблема в том, что при вводе ABRACADABRA
я получаю исключение string index out of range. До того, как у меня появилось это исключение, у меня было слово, которое печатает его как BRACADABR
Я не уверен, зачем, если мне нужно добавить еще один цикл в мою программу.
Если у вас, ребята, также есть более эффективный способ запуска кода, чем у меня, пожалуйста, дайте мне знать!
def scrambleWord(userInput):
count = 0
scramble = ''
while count < len(userInput):
if userInput[count] =='A' and userInput[count 1] != 'A':
scramble = userInput[count 1] userInput[count]
count =2
elif userInput[count] != 'A':
scramble = userInput[count]
count =1
if count < len(userInput):
scramble = userInput(len(userInput)-1)
return scramble
#if a is found switch the next letter index with a's index
def main():
userInput = input("Enter a word: ")
finish = scrambleWord(userInput.upper())
print(finish)
main()
Комментарии:
1. Будет ли это иметь какое-либо значение, если вы поменяетесь
A
сA
или нет?
Ответ №1:
Когда вы доходите до конца строки, и это ‘A’, ваша программа запрашивает следующий символ, который находится вне конца строки.
Измените цикл, чтобы он не включал последний символ:
while count < len(userInput)-1:
if ...
Ответ №2:
Вы можете изменить свой код, как показано ниже:
def scrambleWord(userInput):
count = 0
scramble = ''
while count < len(userInput):
if count < len(userInput)-1 and userInput[count] =='A' and userInput[count 1] != 'A':
scramble = userInput[count 1] userInput[count]
count =2
else:
scramble = userInput[count]
count =1
return scramble
Вы не проверяете условие ( count < len(userInput)-1
), когда логика пытается проверить вхождение A
и поменять местами со следующей буквой. Оно выдает исключение string index out of range.
Ответ №3:
Проблема возникает в вашем коде, когда последним символом во входных данных является ‘A’. Это связано с тем, что ваш первый if в цикле пытается получить доступ к символу ‘count 1’ во время последней итерации. И поскольку в этой позиции нет символа, вы получаете ошибку индекса.
Самым простым решением было бы создать отдельное условие if для того же самого. Обновленный фрагмент для цикла while может выглядеть следующим образом —
# while start
while count < len_: # len_ is length of input
if count 1 >= len_:
break # break outta loop, copy last character
current = inp[count]
next_ = inp[count 1]
if current == 'A':
op = ( next_ current) # op is result
count = 1
else:
op = current
# increment counter by 1
count = 1
# rest of the code after while is same
Еще одна небольшая проблема в вашем коде заключается в том, что при копировании последнего символа (после завершения цикла) вы должны использовать [ ] вместо ( ) для ссылки на последний символ во входной строке.
Ответ №4:
Просто для удовольствия :
from functools import reduce
def main():
word = input("Enter a word: ").lower()
scramble = reduce((lambda x,y : x[:-1] y 'A'
if (x[-1]=='a' and y!=x[-1])
else x y),word)
print(scramble.upper())
main()