【问题标题】:String index out of range in PythonPython中的字符串索引超出范围
【发布时间】:2016-08-11 18:09:03
【问题描述】:
def romanToNum(word):
    word = word.upper()

    numeralList2 = list(zip(
        [1000, 500, 100, 50, 10, 5, 1],
        ['M', 'D', 'C', 'L', 'X', 'V', 'I']
    ))
    num = 0
    x = []
    a = 0
    b = 2


    if len(word) % 2 != 0:
        word = word + "s"

    for i in range(0,len(word)):
        x.append(word[a:b])
        a = a + 2
        b = b + 2
        print(x[i]) 

    for n in x:
        for nNum,rNum in numeralList2:
            if n == rNum:
                num = nNum + num 
            elif n == (n[0] + n[1]):
                num = (nNum*2) + num             
            elif n[0] == rNum:
                r1 = 0
                r1 = nNum
            elif n[1] == rNum:
                r2 = 0
                r2 = nNum
            elif r1 < r2:
                num = num + (r2 - r1)
            elif r1 > r2:
                num = num + (r1 + r2)            
    return num        

romanToNum("xxx")

我收到以下错误:

  elif n == (n[0] + n[1]):
IndexError: string index out of range

我将它放在循环中的哪个位置并不重要,它只是不会识别n 具有索引值。

我也收到此错误:Traceback (most recent call last):

当我调用我的函数时:romanToNum("xxx")

我不太确定发生了什么,因为我在添加列表的位置添加了 print 语句,并且 is 的索引至少为 [0] 当我把它全部打印出来的时候。这里有什么帮助吗?

我已经在堆栈中查看了类似的问题,但它们的解决方案是缩进,或者因为它们有一个负索引([-1])或类似的东西,但我所有的缩进都是正确的,我的索引都是正的。

【问题讨论】:

  • 如果没有至少为[1] 的索引,n[1] 将失败并出现该错误。如果您在 for 循环的开头添加 print(n),您将看到 n 只有一个字符长(因此没有索引 1)当您遇到此异常时。
  • @dimo414 为什么不呢?我附加了它,以便当 for 循环通过我的 list(x) 运行时,“n”值将在循环中运行时包含 2 个字符串。
  • @user3882522 正如我在回答中所展示的那样,这并没有真正起作用,因为您在构建 x 时进行了太多迭代,并且最终将空字符串添加到列表的末尾。跨度>

标签: python string list for-loop


【解决方案1】:

您的第一个 for 循环出现问题,超出预期,影响到 x[i] 的空字符串。应该是:for i in range(int(len(word)/2)):

那么你的第二个循环也需要修复。

if n == rNum : 永远不会实现,因为 rNum 是一个单字符的字符串,x 的长度是 2。试试n == rNum+"s"。 对于 2 个字符的字符串,n == n[0] + n[1] 始终为 True。你的意思一定是n == rNum * 2

另外,建议使用x += 1 而不是x = x + 1

【讨论】:

    【解决方案2】:

    nx 的一个元素。 n == n[0] + n[1]线上的IndexError表示某个n的长度小于2

    您添加了一个word = word + 's' 可能是为了防止x 中包含一个字符元素,但它并没有真正起作用。

    如果你看看你是如何构建x 列表的:

    x = []
    a = 0
    b = 2
    
    
    if len(word) % 2 != 0:
        word = word + "s"
    
    for i in range(0,len(word)):
        x.append(word[a:b])
        a = a + 2
        b = b + 2
        print(x[i]) 
    

    因此,在您的示例中,您从 x = []word = 'XXX' 开始。然后你添加一个s得到word = 'XXXs'

    i 上的循环执行以下操作:

    • i=0 所以x.append(word[0:2]); a = a+2; b = b+2 所以x = ['XX']a=2b=4

    • i=1 所以x.append(word[2:4]); a = a+2; b = b+2 所以x = ['XX', 'Xs']a=4b=6

    • i=2 所以x.append(word[4:6]); a = a+2; b = b+2 所以x = ['XX', 'Xs', '']a=6b=8
    • i=3 所以 x.append(word[6:8]); a = a+2; b = b+2 所以 x = ['XX', 'Xs', '', '']a=8b=10

    在这里您看到n 可以是空字符串,这意味着在执行n == n[0] + n[1] 时您最终会得到IndexError

    我相信您想将字符两两分组,但是i 应该使用2 的步长:

    for i in range(0, len(word), 2):
        x.append(word[i:i+2])
    

    这样i0,然后是2,然后是4 等等


    顺便说一句:一旦你修复了这个条件n == n[0] + n[1] 似乎很奇怪,因为如果n 是一个两个字符串(如果你修复了代码应该是这样),那么条件将永远为真。你到底想在这里做什么?

    【讨论】:

    • 现在我记得了,我在检查两组是否相同。所以如果我要输入“xx”,那么它将保持一个值为 true 并将相应的值乘以 2,所以在这种情况下它将是 20。至少这就是我想要做的......
    • 我的代码有点问题,需要帮忙吗?
    • @user3882522 然后你想检查n[0] == n[1]。如果您有其他问题,您应该尝试自己解决,并最终提出一个新问题。
    • 我一直在努力,哈哈。我会提出一个关于它的新问题,我只是希望你只是在我被遗忘之前。这个网站对新用户/初学者问题不是很友好,即使它们是有效的。
    【解决方案3】:

    这是罪魁祸首:

    for i in range(0,len(word)):
         x.append(word[a:b])
         a = a + 2
         b = b + 2
    

    在这个循环结束时,x 将是['XX', 'Xs', '', '']。由于您将字符分组为两个一组,因此组的总数将是字符串长度的一半。所以只需使用range(0,len(word)/2)range(0,len(word),2) 将迭代次数减半

    【讨论】:

      猜你喜欢
      • 2016-02-10
      • 2019-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多