问题描述
嗨,我正在尝试解决此问题,但无法解决这些错误
我要如何解决该问题的想法是,首先将名称分为名称和罗马数字,然后将罗马转换为阿拉伯数字,然后将其排序为整数,然后将阿拉伯数字反向转换为罗马
def from_roman(num):
roman_numerals = {'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}
result = 0
for i,c in enumerate(num):
if (i+1) == len(num) or roman_numerals[c] >= roman_numerals[num[i+1]]:
result += roman_numerals[c]
else:
result -= roman_numerals[c]
return result
# convert from arabic to roman
def to_roman(num):
roman_numerals = {1:'I',5:'V',10:'X',50:'L',100:'C',500:'D',1000:'M'}
result=''
for i,c in enumerate(num):
if (i+1) == len(num) or roman_numerals[c] >= roman_numerals[num[i+1]]:
result += roman_numerals[c]
else:
result -= roman_numerals[c]
return result
def SortPrintKingsNames(kings):
romanList=[]
arabicList=[]
#sort kings name first
kings.sort()
#sort roman numbers by converting them to arabic and sorting them
for king in kings:
romanList.append(from_roman(king.split()[-1]))
romanList.sort()
#convert to roman again
for roman in romanList:
arabicList=to_roman(roman)
for k in kings:
# print names with roman number
print(k,arabicList[k])
以下是错误:
Traceback (most recent call last):
File "Solution.py",line 58,in <module>
SortPrintKingsNames(kingsNames)
File "Solution.py",line 48,in SortPrintKingsNames
arabicList=to_roman(roman)
File "Solution.py",line 29,in to_roman
for i,c in enumerate(num):
TypeError: 'int' object is not iterable
解决方法
由于尝试枚举阿拉伯(整数)值而引发错误。
更新to_roman
函数以解决该问题。
尝试以下代码:
def from_roman(num): # IV > 4
roman_numerals = {'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}
result = 0
for i,c in enumerate(num):
if (i+1) == len(num) or roman_numerals[c] >= roman_numerals[num[i+1]]:
result += roman_numerals[c]
else:
result -= roman_numerals[c]
return result
# convert from arabic to roman
def to_roman(num): # 4 > IV
roman_numerals = {1:'I',5:'V',10:'X',50:'L',100:'C',500:'D',1000:'M'}
result=''
for k in list(roman_numerals.keys())[::-1]:
while num >= k:
result+=roman_numerals[k]
num -= k
# do replacements based on 'max 3' rule
rt = [('DCCCC','CM'),('CCCC','CD'),('LXXXX','XC'),('XXXX','XL'),('VIIII','IX'),('IIII','IV')]
for r in rt:
result = result.replace(*r) # convert tuple to args
# for i,c in enumerate(num):
# if (i+1) == len(num) or roman_numerals[c] >= roman_numerals[num[i+1]]:
# result += roman_numerals[c]
# else:
# result -= roman_numerals[c]
return result
def SortPrintKingsNames(kings):
print(kings)
romanList=[]
arabicList=[]
#sort kings name first
#kings.sort()
#sort roman numbers by converting them to arabic and sorting them
#romanlist = from_roman(kings)
for king in kings:
romanList.append(from_roman(king.split()[-1]))
print(romanList)
romanList.sort()
print(romanList)
#convert to roman again
for roman in romanList:
arabicList.append(to_roman(roman))
print(arabicList)
# for k in kings:
# print names with roman number
# print(k,arabicList[k])
k = SortPrintKingsNames(['VI','I','IC','XX'])
输出
['VI','XX']
[6,1,99,20]
[1,6,20,99]
['I','VI','XX','XCIX']
请注意,IC(99)不是有效的罗马数字,因此将其转换为XCIX。
替换是基于“最大3”规则完成的。任何数量的文件仅需要6个替换项,因此列出替换项比较容易,而不必使用复杂的循环。
罗马数字规则(请注意规则4):
https://classace.io/learn/math/3rdgrade/roman-numerals-ivxlcdm
请注意,如果将其用于地区编号,则您需要的最大编号是72(LXXII)。
https://en.wikipedia.org/wiki/Heinrich_LXXII,_Prince_Reuss_of_Lobenstein_and_Ebersdorf