Как исправить исключение строкового индекса вне диапазона в Python

Есть некоторая проблема с моим кодом 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()

Будет ли какая-то разница, если вы поменяете A на A или нет?

Klaus D. 28.03.2019 05:19
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
102
4

Ответы 4

Когда вы дойдете до конца строки, и это «А», ваша программа запрашивает следующий символ, который находится за пределами конца строки.

Измените цикл, чтобы он не включал последний символ:

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

Другие вопросы по теме