[英]IndexError string index out of range
s="(8+(2+4))"
def checker(n):
if len(n) == 0:
return True
if n[0].isdigit==True:
if n[1].isdigit==True:
return False
else:
checker(n[1:])
else:
checker(n[1:])
这就是我到目前为止所拥有的。 简单的代码,试图查看字符串是否满足以下条件。 但是当我执行检查时,我得到:
True
IndexError: string index out of range
有帮助吗? 提前谢谢编辑:如果字符串只包含单个数字,则函数的目的是产生true;如果字符串中存在2个或更多数字的数字,则产生false。
当n
的长度为0时, n[0]
部分将引发错误,因为该字符串为空。 你应该在那里添加一个return
语句而不是print。
def checker(n):
if len(n) < 2:
return True
if n[0] in x:
请注意,条件必须为len(n) < 2
否则当字符串的长度为n[1]
时,您将在n[1]
上收到错误。
其次,您正在尝试将字符匹配到包含整数的列表,因此in检查始终为False
。 将列表项转换为字符串或更好地使用str.isdigit
。
>>> '1'.isdigit()
True
>>> ')'.isdigit()
False
>>> '12'.isdigit()
True
更新:
你可以使用regex
和all
这些:
>>> import re
def check(strs):
nums = re.findall(r'\d+',strs)
return all(len(c) == 1 for c in nums)
...
>>> s="(8+(2+4))"
>>> check(s)
True
>>> check("(8+(2+42))")
False
代码的工作版本:
s="(8+(2+4))"
def checker(n):
if not n: #better than len(n) == 0, empty string returns False in python
return True
if n[0].isdigit(): #str.digit is a method and it already returns a boolean value
if n[1].isdigit():
return False
else:
return checker(n[1:]) # use return statement for recursive calls
# otherwise the recursive calls may return None
else:
return checker(n[1:])
print checker("(8+(2+4))")
print checker("(8+(2+42))")
输出:
True
False
你应该在第一个if语句后return True
,而不是print True
。 该函数在该语句之后继续运行,并在输入大小为0时遇到错误。
我无法重现你的错误。
我不得不解决一些问题:
.isdigit()
是一个函数; 调用.isdigit==True
将比较一个函数对象与True,这永远不会是真的。 我改变了.isdigit==True
为.isdigit()
除此之外,一些印刷声明表明这是按预期工作的
s="(8+(2+4))"
t="(8+(20+4))"
def checker(n):
print "checking %s" % n
if len(n) == 0:
print "Returning true"
return True
if n[0].isdigit():
if n[1].isdigit():
print "returning false"
return False
else:
return checker(n[1:])
else:
return checker(n[1:])
print checker(s)
print checker(t)
输出:
checking (8+(2+4))
checking 8+(2+4))
checking +(2+4))
checking (2+4))
checking 2+4))
checking +4))
checking 4))
checking ))
checking )
checking
Returning true
True
checking (8+(20+4))
checking 8+(20+4))
checking +(20+4))
checking (20+4))
checking 20+4))
returning false
False
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.