2016-04-05 63 views
0

如何避免我在此函数中遇到的错误?我不明白为什么我会遇到这个错误,我只是想不出一个解决方案。我将不胜感激任何提示!谢谢。我该如何避免'索引超出范围'错误?

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 
+1

什么是'p'? – cdonts

+0

哈哈对不起,只是修好它 – user1234567

+0

那么为什么这一行:p =“qqwweerrttyy”?如果您收到p作为arg –

回答

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] 
0

与你的功能,你问的一个,第一个问题是:你是否p是空的,但你访问两个元素p[0]p[1]。您需要检查p是否有至少两个元素,然后才能访问p[1]

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

修复此问题后,您会发现下一个错误。

+0

看来你引入了一个bug:在这种情况下,最后一个字母不会被记录下来。 – blazs

+0

@blazs只有排序。无论函数总是返回一个空列表,因为没有任何中间结果是返回值的一部分(永远)。 :)通过使用全局变量而不是纯递归来改变语义,这隐藏了这个错误。 – dsh

+0

够公平的。 :-) – blazs