Как избежать ошибки "индекс вне диапазона"?
Как избежать ошибки, которую я получаю в этой функции? Я не очень понимаю, почему я получаю эту ошибку, я просто не могу придумать решение. Буду очень признателен за любые советы! благодарю вас.
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]:
...
После того, как вы исправите это, вы найдете следующую ошибку.