【问题标题】:Getting string index out of range? python 3使字符串索引超出范围?蟒蛇 3
【发布时间】:2018-03-03 05:03:01
【问题描述】:

我的程序应该以字符串的形式接受输入并拆分为字符串,其中包含所有小写字母、下划线和点。另一个带有所有大写字母、管道和空格。我不应该使用(功能)

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

你能告诉我更多关于我遇到的错误吗?

如果字母[0].isupper() 或字母[0] == "|"或字母[0].isspace(): IndexError: 字符串索引超出范围

【问题讨论】:

  • 因为letters是空字符串?
  • @WillemVanOnsem 我的输入将是 letters = "HfEFfefF _" 例如
  • 但是你在字符串的尾部执行递归调用。

标签: python-3.x uppercase lowercase


【解决方案1】:

您已经定义了一个递归函数split_rec 调用split_rec (letters[1:])。由于字符串的长度有限,最终您将将空字符串传递给它。这意味着您无法访问第一个字符,因为它没有第一个字符。

你可以通过使用守卫来解决这个问题:

def split_rec (letters):
    uppers = ""
    lowers = ""
    if not letters:
        return lowers, uppers
    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 返回一个由两个字符串组成的元组,因此您不能将其添加到字符中。您可以使用以下方法解决问题:

def split_rec (letters):
    if not letters:
        return lowers, uppers
    lowers, uppers = split_rec(letters[1:])
    if letters[0].isupper() or letters[0] == "|" or letters[0].isspace():
        uppers = letters[0] + uppers
    elif letters[0].islower() or letters[0] == "_" or letters[0] == ".":
        lowers = letters[0] + lowers
    return lowers, uppers

但是随输入线性缩放的递归在 Python 中是个坏主意:Python 不会优化递归调用,因此很容易得到 StackOverflow 异常(这有与本网站无关)。

你最好使用生成器和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

【讨论】:

  • > lowers, uppers = split_rec() TypeError: split_rec() missing 1 required positional argument: 'letters' 非常感谢,我明白你在那里做了什么,但我现在收到这个错误,我知道我问了很多,但我真的很了解你
  • @nazeeroobu:是的,我忘记添加参数了。
【解决方案2】:

正如@willemVanOnsem 指出的那样,您在减去第一个字符的字符串上递归调用它。最终,您在一个空字符串上调用它,这就是您收到索引错误的原因。在做任何其他事情之前检查“字母”是否为空。

附带说明,我认为您的递归调用不会达到您的预期。

你可以使用while循环吗?你提到不使用for循环?还是必须使用递归?

【讨论】:

    猜你喜欢
    • 2014-11-27
    • 2013-04-15
    • 2016-02-25
    • 2020-11-18
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    • 2016-02-19
    相关资源
    最近更新 更多