[英]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]
)或类似的东西,但我所有的缩进都是正确的,我的索引都是正的。
那么n
是x
一个元素。 行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=2
和b=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=4
和b=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=6
和b=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=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])
这样i
是0
,然后是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.