使用python对王室名称进行排序

问题描述

嗨,我正在尝试解决此问题,但无法解决这些错误
我要如何解决该问题的想法是,首先将名称分为名称和罗马数字,然后将罗马转换为阿拉伯数字,然后将其排序为整数,然后将阿拉伯数字反向转换为罗马

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