Как исправить исключение String index out of range в Python

#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()