IndexError: строковый индекс вне диапазона функции очистки уравнения - PullRequest
0 голосов
/ 14 октября 2019

У меня есть код для добавления ^0 ко всем константам в моем коде, чтобы, если бы у вас была строка «3x ^ 2 + 14 + 2», она стала бы «3x ^ 2 + 14 ^ 0 + 2 ^ 0»Однако я получаю IndexError, и я понятия не имею, что я делаю неправильно. Это мой код:

def cleanEquation(equation):
    equation = ''.join(equation.split())
    for i in range(len(equation)):
        if equation[i].isdigit():
            if equation[i-1] != "^":
                if i == len(equation)-1:
                    equation = equation[:i+1] + '^0'
                if equation[i+1] == "+" or equation[i+1] == "-":
                    equation = equation[:i+1] + '^0' + equation[i+1]

cleanEquation("x+14+y+14")

Всякий раз, когда я пытаюсь запустить это, я получаю:

IndexError: string index out of range

Это только фрагмент функции, целая функция добавляет 1 к началу каждогокоэффициент, а также добавляет ^ 1 к каждой переменной без коэффициента, и эти две части работают по какой-то причине нормально, хотя они имеют одинаковый формат - эта часть функции. Я могу опубликовать полную функцию, если это необходимо.

1 Ответ

1 голос
/ 14 октября 2019
for i in range(len(equation)):

использует исходную длину equation в качестве ограничения i. Но строка:

equation = equation[:i+1] + '^0' + equation[i+1]

удаляет символы из equation. Когда i достигает новой длины equation, вы получаете ошибку.

Вам необходимо использовать цикл while, чтобы сравнивать текущую длину, а не исходную длину.

i = 0
while i < len(equation):
    if equation[i].isdigit():
        if equation[i-1] != "^":
            if i == len(equation)-1:
                equation = equation[:i+1] + '^0'
            if equation[i+1] == "+" or equation[i+1] == "-":
                equation = equation[:i+1] + '^0' + equation[i+1]
    i += 1

Вы можете сделать все это с помощью подстановки регулярного выражения:

import re

def cleanEquation(equation):
    equation = ''.join(equation.split())
    equation = re.sub(r'(?<=\d\b)(?!\^)', '^0', equation)
    return equation

(?<=\d\b) - это вид сзади, который соответствует цифре, за которой следует граница слова, то есть последняя цифра онемения,(?!\^) - это отрицательный прогноз, который запрещает сопоставление, если за номером уже следует ^.

...