python -Roman numeral converter "TypeError: 'int' object is not iterable"

python -Roman numeral converter "TypeError: 'int' object is not iterable"

我对编码还是很陌生,我一直在努力完成朋友给我的这个挑战。我必须将用户的数字列表转换为他们的罗马数字。但是,我使用的第二个函数得到了 "TypeError: 'int' object is not iterable" 。

def romanizer(n, arr):

    output = []

    for i in range(n):
        individual = arr.pop(0)
        x = convert(individual)
        output.append(x)

    print output

def convert(num):

    roman_table = { 1000: 'M', 900: 'CM', 500: 'D',
                    400: 'CD' , 100: 'C', 90: 'XC',
                    50: 'L', 40: 'XL', 10: 'X', 
                    9: 'IX', 5: 'V', 4: 'IV',
                    1: 'I'}  

    roman = ''
    while num > 0:
        for number, numeral in roman_table: # This is where the error sends me
            while num >= number:
                roman += numeral
                num -= number 

    return roman

units = int(raw_input("How many numbers must be converted? "))
numbers = raw_input("Which numbers? ")
converted = list(map(int, numbers.split()))

print units
print numbers

romanizer(units, converted)

我在执行以下输入后收到以下错误:

How many numbers must be converted? 2
Which numbers? 111 506
2
111 506

Traceback (most recent call last):
  File "romanizer.py", line 37, in <module>
    romanizer(units, converted)
  File "romanizer.py", line 9, in romanizer
    x = convert(individual)
  File "romanizer.py", line 24, in convert
    for number, numeral in roman_table:
TypeError: 'int' object is not iterable

这里有人可以帮助我吗?我不确定为什么会出现错误,因为它应该根据我设置的条件使用数字来遍历我的字典。任何帮助将不胜感激

遍历字典会产生仅键,但您试图将每个键分配给两个变量:

for number, numeral in roman_table:

您的密钥是整数,因此循环尝试这样做:

>>> number, numeral = 1000
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable

给你例外。

改为循环 roman_table.items()

for number, numeral in roman_table.items():

但是,字典是无序的。你真的想从 big 罗马数字开始,而不是随便一个,所以 sort 你的项目:

for number, numeral in sorted(roman_table.items(), reverse=True):

排序也是有代价的;您可能希望将 table 列为序列,而不是字典,这样您就可以避免排序:

roman_table = [
    (1000, 'M'), (900, 'CM'), (500, 'D'), (400, 'CD'), (100, 'C'),
    (90, 'XC'), (50, 'L'), (40, 'XL'), (10, 'X'), (9, 'IX'), (5, 'V'),
    (4, 'IV'), (1, 'I')
]

for number, numeral in roman_table:

table现在是一个元组列表,所以也不需要再使用.items()了。

使用反向排序 table,你得到正确的输出:

>>> convert(111)
'CXI'
>>> convert(506)
'DVI'
>>> convert(999)
'CMXCIX'