You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python用字典转换西语数字单词出现KeyError: 'y'如何解决

问题原因
  • 你直接对输入做空格拆分,西语数字里连接十位数和个位数的y没有被收录进映射字典,直接查询就会触发KeyError: 'y'
  • 你的映射字典里存在大量多空格的key(比如noventa y nueve、dos cientos等),按单个单词拆分后永远匹配不到这类多词key,匹配逻辑本身不可行
解决思路

采用最长前缀匹配规则:先把映射字典的所有key按字符长度倒序排序,优先匹配更长的词组,匹配到对应片段后直接替换成映射值,跳过已匹配的片段,避免拆分出无效的单字。

修改后可运行代码
# 西语数字转0-1000阿拉伯数字
number = "novecientos noventa y nueve"
help_dict = {
    'uno':'01','dos':'02','tres':'03','cuatro':'04','cinco':'05','seis':'06','siete':'07','ocho':'08','nueve':'09',
    'diez':'10','once':'11','doce':'12','trece':'13','catorce':'14','quince':'15','dieciseis':'16','dieci seis':'16','diecisiete':'17','dieci siete':'17','dieciocho':'18','dieci ocho':'18','diecinueve':'19','dieci nueve':'19',
    'veinte':'20', 'veintiuno':'21', 'veinti uno':'21', 'veintidos':'22', 'veinti dos':'22', 'veintitres':'23', 'veinti tres':'23','veinticuatro':'24', 'veinti cuatro':'24', 'veinticinco':'25', 'veinti cinco':'25', 'veintiseis':'26', 'veinti seis':'26','veintisiete':'27','veinti siete':'27','veintiocho':'28','veinti ocho':'28', 'veintinueve':'29', 'veinti nueve':'29',
    'treinta':'30', 'treinta y uno':'31', "treintayuno":'31', 'treinta y dos':'32', 'treintaydos':'32','treinta y tres':'33','treintaytres':'33','treinta y cuatro':'34','treintaycuatro':'34','treinta y cinco':'35','treintaycinco':'35','treinta y seis':'36','treintayseis':'36','treinta y siete':'37','treintaysiete':'37','treinta y ocho':'38','treintayocho':'38','treinta y nueve':'39','treintaynueve':'39',
    'cuarenta':'40','cuarenta y uno':'41','cuarentayuno':'41','cuarenta y dos':'42','cuarentaydos':'42','cuarenta y tres':'43','cuarentaytres':'43','cuarenta y cuatro':'44','cuarentaycuatro':'44','cuarenta y cinco':'45','cuarentaycinco':'45','cuarenta y seis':'46','cuarentayseis':'46','cuarenta y siete':'47','cuarentaysiete':'47','cuarenta y ocho':'48','cuarentayocho':'48','cuarenta y nueve':'49','cuarentaynueve':'49',
    'cincuenta':'50','cincuenta y uno':'51','cincuentayuno':'51','cincuenta y dos':'52','cincuentaydos':'52','cincuenta y tres':'53','cincuentaytres':'53','cincuenta y cuatro':'54','cincuentaycuatro':'54','cincuenta y cinco':'55','cincuentaycinco':'55','cincuenta y seis':'56','cincuentayseis':'56','cincuenta y siete':'57','cincuentaysiete':'57','cincuenta y ocho':'58','cincuentayocho':'58','cincuenta y nueve':'59','cincuentaynueve':'59',
    'sesenta':'60','sesenta y uno':'61','sesentayuno':'61','sesenta y dos':'62','sesentaydos':'62','sesenta y tres':'63','sesentaytres':'63','sesenta y cuatro':'64','sesentaycuatro':'64','sesenta y cinco':'65','sesentaycinco':'65','sesenta y seis':'66','sesentayseis':'66','sesenta y siete':'67','sesentaysiete':'67','sesenta y ocho':'68','sesentayocho':'68','sesenta y nueve':'69','sesentaynueve':'69',
    'setenta':'70','setenta y uno':'71','setentayuno':'71','setenta y dos':'72','setentaydos':'72','setenta y tres':'73','setentaytres':'73','setenta y cuatro':'74','setentaycuatro':'74','setenta y cinco':'75','setentaycinco':'75','setenta y seis':'76','setentayseis':'76','setenta y siete':'77','setentaysiete':'77','setenta y ocho':'78','setentayocho':'78','setenta y nueve':'79','setentaynueve':'79',
    'ochenta':'80','ochenta y uno':'81','ochentayuno':'81','ochenta y dos':'82','ochentaydos':'82','ochenta y tres':'83','ochentaytres':'83','ochenta y cuatro':'84','ochentaycuatro':'84','ochenta y cinco':'85','ochentaycinco':'85','ochenta y seis':'86','ochentayseis':'86','ochenta y siete':'87','ochentaysiete':'87','ochenta y ocho':'88','ochentayocho':'88','ochenta y nueve':'89','ochentaynueve':'89',
    'noventa':'90','noventa y uno':'91','noventayuno':'91','noventa y dos':'92','noventaydos':'92','noventa y tres':'93','noventaytres':'93','noventa y cuatro':'94','noventaycuatro':'94','noventa y cinco':'95','noventaycinco':'95','noventa y seis':'96','noventayseis':'96','noventa y siete':'97','noventaysiete':'97','noventa y ocho':'98','noventayocho':'98','noventa y nueve':'99','noventaynueve':'99',
    'cien':'100',
    'ciento':'1',
    'dos cientos':'2','doscientos':'2',
    'tres cientos':'3','trescientos':'3',
    'cuatro cientos':'4','cuatrocientos':'4',
    'quinientos':'5',
    'seis cientos':'6','seiscientos':'6',
    'sete cientos':'7','setecientos':'7',
    'ocho cientos':'8','ochocientos':'8',
    'nove cientos':'9','novecientos':'9',
    'mil':'1000',
    'cero' : '0'
}

# 按key长度倒序排序,优先匹配长词组
sorted_keys = sorted(help_dict.keys(), key=lambda x: len(x), reverse=True)
input_str = number.lower()
res = []
i = 0
n = len(input_str)

while i < n:
    matched = False
    for key in sorted_keys:
        key_len = len(key)
        if i + key_len <= n and input_str[i:i+key_len] == key:
            res.append(help_dict[key])
            i += key_len
            matched = True
            break
    # 没匹配到的字符(比如空格、无意义连接词)直接跳过
    if not matched:
        i += 1

# 拼接后转整型
final_num = int(''.join(res))
print(final_num)
print(type(final_num))

测试输入novecientos noventa y nueve会输出999,类型为整型,符合预期。

内容的提问来源于stack exchange,提问作者user15898019

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 07:54:04