Как избежать ошибки "индекс вне диапазона"?

Как избежать ошибки, которую я получаю в этой функции? Я не очень понимаю, почему я получаю эту ошибку, я просто не могу придумать решение. Буду очень признателен за любые советы! благодарю вас.

def myfunction(p):
    result = []
    count = 1
    if not p:
        return result
    else:
        if p[0] == p[1]:
            count + 1
            return myfunction(p[1:])
        else:
            result += (p[0],count)
            count = 1
            return myfunction(p[1:])

функция должна вернуть что-то вроде этого:

myfunction("qqwweerrttyy")
[("q",2),("w",2),("e",2),("r",2),("t",2),("y",2)]

Ошибка:

  File "test.py", line 36, in myfunction
    return myfunction(p[1:])
  File "test.py", line 32, in myfunction
    return myfunction(p[1:])
  File "test.py", line 30, in myfunction
    if p[0] == p[1]:
IndexError: string index out of range

2 ответа

Решение

Потому что вы индекс p[1] даже когда p может содержать один элемент; Вы должны убедиться, что p[1] существует. Вы, вероятно, также хотите сказать count += 1не count+1, который, кажется, не выполняет никакой работы в коде, который вы дали. (Я предполагаю, что count а также result являются глобальными переменными; в противном случае код не имеет смысла.)

Вот рабочий код:

count = 1
result = []
def myfunction(p):
    global count
    global result
    if not p:
        return result
    else:
        if len(p) >= 2 and p[0] == p[1]: # Make sure p[1] exists
            count += 1
            return myfunction(p[1:])
        else:
            result += (p[0],count)
            count = 1
            return myfunction(p[1:])

Например, когда дана строка "lllalala" результат, как и ожидалось:

>>> myfunction("lllalala")
['l', 3, 'a', 1, 'l', 1, 'a', 1, 'l', 1, 'a', 1]

Первая проблема с вашей функцией, о которой вы спрашивали, заключается в следующем: вы проверяете, p пусто, но затем вы получаете доступ к двум элементам p[0] а также p[1], Вы должны проверить это p имеет по крайней мере два элемента, прежде чем вы сможете получить доступ p[1],

if len(p) < 2:
    return result
else:
    if p[0] == p[1]:
        ...

После того, как вы исправите это, вы найдете следующую ошибку.

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