字符串索引超出范围?

时间:2016-04-19 13:52:41

标签: python string list for-loop

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语句, 指数至少{{ 1}} 当我全部打印出来时。这里有什么帮助吗?

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

3 个答案:

答案 0 :(得分:2)

nx的元素。第IndexError行上的n == n[0] + n[1]表示某个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=2以及b=4

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

  • i=2所以x.append(word[4:6]); a = a+2; b = b+2以便x = ['XX', 'Xs', '']a=6以及b=8
  • i=3所以x.append(word[6:8]); a = a+2; b = b+2以便x = ['XX', 'Xs', '', '']a=8以及b=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是一个两个字符的字符串(如果你修复代码应该是这样)那么条件将会永远是真的。你想在这里做什么?

答案 1 :(得分:1)

这是罪魁祸首:

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)

的迭代次数减半

答案 2 :(得分: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