让字符串索引超出范围? python 3
Getting string index out of range? python 3
我的程序应该接受字符串形式的输入并拆分成字符串,一个包含所有小写字母、下划线和点。另一个包含所有大写字母、管道和空格。我不应该使用(功能)
def split_rec (letters):
uppers = ""
lowers = ""
if letters[0].isupper() or letters[0] == "|" or letters[0].isspace():
uppers += letters[0] + split_rec (letters[1:])
elif letters[0].islower() or letters[0] == "_" or letters[0] == ".":
lowers += letters[0] + split_rec (letters[1:])
elif not letters:
return lowers, uppers
你能告诉我更多有关我遇到的错误的信息吗?
if letters[0].isupper() or letters[0] == "|" or letters[0].isspace():
IndexError: string index out of range
您已经定义了一个 递归函数 :split_rec
调用 split_rec (letters[1:])
。由于字符串的长度有限,最终您将 将空字符串 传递给它。这意味着您无法访问第一个字符,因为它没有第一个字符。
你可以通过使用守卫来解决这个问题:
def split_rec (letters):
uppers = ""
lowers = ""
<b>if not letters:
return lowers, uppers</b>
if letters[0].isupper() or letters[0] == "|" or letters[0].isspace():
uppers += letters[0] + split_rec (letters[1:])
elif letters[0].islower() or letters[0] == "_" or letters[0] == ".":
lowers += letters[0] + split_rec (letters[1:])
elif not letters:
return lowers, uppers
但这不能解决问题: 因为split_rec
returns 是两个字符串的元组,所以不能将其添加到字符中。您可以使用以下方法解决问题:
def split_rec (letters):
if not letters:
return lowers, uppers
<b>lowers, uppers = split_rec(letters[1:])</b>
if letters[0].isupper() or letters[0] == "|" or letters[0].isspace():
<b>uppers = letters[0] + uppers</b>
elif letters[0].islower() or letters[0] == "_" or letters[0] == ".":
<b>lowers = letters[0] + lowers</b>
return lowers, uppers
但是尽管如此递归与输入成线性关系是Python一个坏主意:Python不优化递归调用,所以很容易得到Whosebug 异常(这与本网站无关)。
你最好使用生成器和 join
字符串:
def split_rec (letters):
uppers = ''.join(c for c in letters if c.isupper() or c == "|" or c.isspace())
lowers = ''.join(c for c in letters if c.islower() or c == "_" or c == ".")
return lowers, uppers
正如@willemVanOnsem 所指出的,您是在减去第一个字符的字符串上递归调用它。最终,您在一个空字符串上调用它,这就是您收到索引错误的原因。在执行任何其他操作之前检查 "letters" 是否为空。
附带说明一下,我认为您的递归调用不会达到您的预期。
可以使用 while 循环吗?你提到不使用 for 循环?还是必须使用递归?
我的程序应该接受字符串形式的输入并拆分成字符串,一个包含所有小写字母、下划线和点。另一个包含所有大写字母、管道和空格。我不应该使用(功能)
def split_rec (letters):
uppers = ""
lowers = ""
if letters[0].isupper() or letters[0] == "|" or letters[0].isspace():
uppers += letters[0] + split_rec (letters[1:])
elif letters[0].islower() or letters[0] == "_" or letters[0] == ".":
lowers += letters[0] + split_rec (letters[1:])
elif not letters:
return lowers, uppers
你能告诉我更多有关我遇到的错误的信息吗?
if letters[0].isupper() or letters[0] == "|" or letters[0].isspace(): IndexError: string index out of range
您已经定义了一个 递归函数 :split_rec
调用 split_rec (letters[1:])
。由于字符串的长度有限,最终您将 将空字符串 传递给它。这意味着您无法访问第一个字符,因为它没有第一个字符。
你可以通过使用守卫来解决这个问题:
def split_rec (letters):
uppers = ""
lowers = ""
<b>if not letters:
return lowers, uppers</b>
if letters[0].isupper() or letters[0] == "|" or letters[0].isspace():
uppers += letters[0] + split_rec (letters[1:])
elif letters[0].islower() or letters[0] == "_" or letters[0] == ".":
lowers += letters[0] + split_rec (letters[1:])
elif not letters:
return lowers, uppers
但这不能解决问题: 因为split_rec
returns 是两个字符串的元组,所以不能将其添加到字符中。您可以使用以下方法解决问题:
def split_rec (letters):
if not letters:
return lowers, uppers
<b>lowers, uppers = split_rec(letters[1:])</b>
if letters[0].isupper() or letters[0] == "|" or letters[0].isspace():
<b>uppers = letters[0] + uppers</b>
elif letters[0].islower() or letters[0] == "_" or letters[0] == ".":
<b>lowers = letters[0] + lowers</b>
return lowers, uppers
但是尽管如此递归与输入成线性关系是Python一个坏主意:Python不优化递归调用,所以很容易得到Whosebug 异常(这与本网站无关)。
你最好使用生成器和 join
字符串:
def split_rec (letters):
uppers = ''.join(c for c in letters if c.isupper() or c == "|" or c.isspace())
lowers = ''.join(c for c in letters if c.islower() or c == "_" or c == ".")
return lowers, uppers
正如@willemVanOnsem 所指出的,您是在减去第一个字符的字符串上递归调用它。最终,您在一个空字符串上调用它,这就是您收到索引错误的原因。在执行任何其他操作之前检查 "letters" 是否为空。
附带说明一下,我认为您的递归调用不会达到您的预期。
可以使用 while 循环吗?你提到不使用 for 循环?还是必须使用递归?