Skip to main content
 首页 » 编程设计

python之将十进制转换为罗马数字

2025年05月04日23mfryf

d_hsp={"1":"I","2":"II","3":"III","4":"IV","5":"V","6":"VI","7":"VII","8":"VIII", 
       "9":"IX","10":"X","11":"XI","12":"XII","13":"XIII","14":"XIV","15":"XV", 
       "16":"XVI","17":"XVII","18":"XVIII","19":"XIX","20":"XX","21":"XXI", 
       "22":"XXII","23":"XXIII","24":"XXIV","25":"XXV"} 
HSP_OLD['tryl'] = HSP_OLD['tryl'].replace(d_hsp, regex=True) 

HSP_OLD 是数据框,tryl 是HSP_OLD 的一列,下面是tryl 中的一些值示例>:

SAF/HSP:二级诊断E代码1

SAF/HSP:二级诊断 E 代码 11

我用字典来替换,它适用于 1-10,但是对于 11,它会变成“II”,对于 12,它会变成“III”。

请您参考如下方法:

抱歉,没有注意到您不仅要更新该字段,而且实际上还想在末尾替换一个数字,但即使是这种情况 - 将您的数字正确转换为罗马数字比将数字转换为罗马数字要好得多映射每个可能出现的情况(如果数字大于 25,您的代码会发生什么情况?)。所以,这是一种方法:

ROMAN_MAP = [(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')] 
 
def romanize(data): 
    if not data or not isinstance(data, str):  # we know how to work with strings only 
        return data 
    data = data.rstrip()  # remove potential extra whitespace at the end 
    space_pos = data.rfind(" ")  # find the last space before the number 
    if space_pos != -1: 
        try: 
            number = int(data[space_pos + 1:])  # get the number at the end 
            roman_number = "" 
            for i, r in ROMAN_MAP:  # loop-reduce substitution based on the ROMAN_MAP 
                while number >= i: 
                    roman_number += r 
                    number -= i 
            return data[:space_pos + 1] + roman_number  # put everything back together 
        except (TypeError, ValueError): 
            pass  # couldn't extract a number 
    return data 

现在,如果我们将您的数据框创建为:

HSP_OLD = pd.DataFrame({"tryl": ["SAF/HSP: Secondary diagnosis E code 1", 
                                 None, 
                                 "SAF/HSP: Secondary diagnosis E code 11", 
                                 "Something else without a number at the end"]}) 

我们无法轻松地将我们的函数应用于整个列:

HSP_OLD['tryl'] = HSP_OLD['tryl'].apply(romanize) 

结果是:

                                         tryl 
0       SAF/HSP: Secondary diagnosis E code I 
1                                        None 
2      SAF/HSP: Secondary diagnosis E code XI 
3  Something else without a number at the end 

当然,您可以根据需要调整 romanize() 函数来搜索字符串中的任何数字并将其转换为罗马数字 - 这只是如何快速查找数字的示例在字符串的末尾。