Python 3.x 如何避免';索引超出范围';这里有错误吗?

Python 3.x 如何避免';索引超出范围';这里有错误吗?,python-3.x,recursion,indexing,indexoutofrangeexception,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:

如何避免此函数中出现的错误?我真的不明白为什么我会犯这个错误,我只是想不出解决办法。我将非常感谢任何提示!多谢各位

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

因为索引
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:])
例如,当给定字符串“lllala”时,输出与预期一致:

>>> 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]:
        ...
如果len(p)<2:
返回结果
其他:
如果p[0]==p[1]:
...

修复此错误后,您将发现下一个错误。

哈哈,很抱歉刚刚修复了它,那么为什么要这样做:p=“qwweerrttyy”?如果以arg形式接收p,是否要为p设置默认值?如果是,请执行def
myfunction(p=“qqweerrtyy”):
我很抱歉,我刚刚意识到我犯了很多错误,但我想我现在已经修复了所有错误。对不起,lol@user1234567请接受最有用的答案(单击答案旁边的复选标记);当我们花时间调试你的代码却被忽略时,这真的很糟糕。似乎你引入了一个bug:最后一个字母在这种情况下不会被记录。@blazs-only排序。尽管如此,函数始终返回空列表,因为中间结果都不是返回值的一部分(永远)您通过使用全局变量而不是纯粹的递归来更改语义,这隐藏了这个bug。