Есть некоторая проблема с моим кодом Python. Я делаю программу, которая находит вхождение буквы A в слово, и если эта буква найдена, а следующая буква не является буквой A, A заменяется следующей буквой.
Например, TAN быть TNA, но WHOA оставаться WHOAAARDVARK быть ARADVRAK
Проблема в том, что когда я ввожу ABRACADABRA, я получаю исключение строкового индекса вне диапазона. До того, как у меня было это исключение, у меня было слово, которое печатает его как 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()






Когда вы дойдете до конца строки, и это «А», ваша программа запрашивает следующий символ, который находится за пределами конца строки.
Измените цикл, чтобы он не включал последний символ:
while count < len(userInput)-1:
if ...
Вы можете изменить свой код, как показано ниже:
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 и поменять местами следующую букву. Он выдает исключение строкового индекса вне диапазона.
Проблема возникает в вашем коде, когда последним символом ввода является «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
Еще одна небольшая проблема в вашем коде заключается в том, что при копировании последнего символа (после завершения цикла) вы должны использовать [] вместо () для ссылки на последний символ во входной строке.
Просто для удовольствия:
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()
Будет ли какая-то разница, если вы поменяете
AнаAили нет?