繁体   English   中英

Python 中的字符串索引超出范围

[英]String index out of range in Python

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语句,在那里我追加我的列表,并至少一个指数[0]当我打印了这一切。 这里有什么帮助吗?

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

那么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.append(word[0:2]); a = a+2; b = b+2 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.append(word[2:4]); a = a+2; b = b+2 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.append(word[4:6]); a = a+2; b = b+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.append(word[6:8]); a = a+2; b = b+2 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是一个两个字符的字符串(如果你修复代码应该是这样)那么条件就会永远是真实的。 你到底想在这里做什么?

这是罪魁祸首:

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)的迭代次数减半

您的第一个 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM