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]
)或者其他类似的东西,但我的所有缩进都是正确的,我的索引都是正数。
答案 0 :(得分:2)
好n
是x
的元素。第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])
这样i
为0
,然后是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
。