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'
我对编码还是很陌生,我一直在努力完成朋友给我的这个挑战。我必须将用户的数字列表转换为他们的罗马数字。但是,我使用的第二个函数得到了 "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'