如何避免指数超出范围'错误在这里?

时间:2016-04-05 19:38:20

标签: python-3.x recursion indexing indexoutofrangeexception

如何避免我遇到此功能的错误?我真的不明白为什么我会收到这个错误,我只是想不出解决方案。我非常感谢任何提示!谢谢。

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 个答案:

答案 0 :(得分:0)

因为即使p[1]可能包含单个元素,您也可以对p进行索引;你必须确保p[1]存在。您可能还想说count += 1,而不是count+1,这似乎在您提供的代码中没有做任何工作。 (我假设countresult是全局变量;否则代码没有意义。)

这是一个有效的代码:

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]

答案 1 :(得分:0)

您的功能的第一个问题,即您询问的问题是:您检查p是否为空,然后您访问两个元素p[0]p[1]。您需要先检查p是否至少包含两个元素,然后才能访问p[1]

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

解决此问题后,您将找到下一个错误。