Python 将罗马数字转换为获取的索引超出范围错误

Python 将罗马数字转换为获取的索引超出范围错误,python,roman-numerals,Python,Roman Numerals,我是python新手。试图把罗马字母转换成数字。一切都很完美,但当我输入一些罗马术语时,我得到了索引错误。请找出错误并纠正我 def roman(x): x=list(x) print(x) s=0 val=[['I',1],['V',5],['X',10],['L',50],['C',100],['D',500],['M',1000]] val=dict(val) while x: a=val[x[0]] b=val[x[1]]

我是python新手。试图把罗马字母转换成数字。一切都很完美,但当我输入一些罗马术语时,我得到了索引错误。请找出错误并纠正我

def roman(x):
    x=list(x)
    print(x)
    s=0
    val=[['I',1],['V',5],['X',10],['L',50],['C',100],['D',500],['M',1000]]
    val=dict(val)


while x:

    a=val[x[0]]
    b=val[x[1]]
    print('a----',a)
    print('b----',b)
    if (a>=b):
        s=s+a
        x=x[1:]
    else:
        s=s+b-a
        x=x[2:]
return s

x=input("Enter roman characters to convert to decimal: ")
x=x.upper()
a=roman(x)
print(a)
当我输入'IXC,IVX'这些术语时,我得到了索引错误。为什么它不接受“我”。我得到的输出如下所示:


您可以试试罗马套餐吗:

>>> import roman
>>> roman.fromRoman('X')
10
>>> roman.fromRoman('IV')
4
>>> roman.fromRoman('V')
5
>>> roman.fromRoman('M')
1000
>>> roman.fromRoman('L')
50
>>> 
至于错误,乔纳森正确地指出:

>>> roman.fromRoman('IXC')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/sharad/trials/udev_env/lib/python3.5/site-packages/roman.py", line 72, in fromRoman
    raise InvalidRomanNumeralError('Invalid Roman numeral: %s' % s)
roman.InvalidRomanNumeralError: Invalid Roman numeral: IXC
>>> 

>>> roman.fromRoman('IVX')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/sharad/trials/udev_env/lib/python3.5/site-packages/roman.py", line 72, in fromRoman
    raise InvalidRomanNumeralError('Invalid Roman numeral: %s' % s)
roman.InvalidRomanNumeralError: Invalid Roman numeral: IVX
>>> 
因此,代码进入else块:

x=x[2:] # x = ['C'] for IXC as input OR x = ['X'] for IVX as input


IXC不是有效的罗马数字;IX和XC是有效的(分别为9和90),但不是三元组。与IVX相似;IV和IX有效,但IVX无效。(你们对IXC和IVX的期望值是多少?)但当我使用在线转换器转换这个罗马术语时,我得到了89,而对于IVX,我得到了4作为输出。。如果愿意,您可以向站点报告错误。仅仅因为它是在线的并不意味着它是正确的。它为VXC-85提供了什么?是的,我可以去看看,但是我太懒了。我有一个程序叫
roman
。当运行为:
roman 89 4 iv iiii LXXIX LXXVIII ixc ivx时,它给出八个答案:
LXXIX
iv
4
4
89
roman:无法将ixc转换为阿拉伯语
roman:无法将ivx转换为阿拉伯语
。当然,这并不比你提到的网站更能证明什么。另请参见上的Wikipedia。我个人更喜欢使用“roman”库:)至于处理崩溃,我将根据我同意u Sharad的规则创建一个表示有效罗马数字的模式列表,但如果我想尝试直接初始化,我想更改while循环。并且该值不应该崩溃。。我应该在while循环中放置什么
x=x[2:] # x = ['C'] for IXC as input OR x = ['X'] for IVX as input
iteration#2

# x only has a single element
a=val[x[0]] # success
b=val[x[1]] # crashes, since x only has a single element