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

Python字典键匹配传值触发KeyError报错的解决方法

字典合并时KeyError问题修复

问题背景

  • 需求:将两个不同数据源SQL查询生成的字典按键匹配,合并指定字段,键不匹配时填充默认空值;因数据源隔离无法在数据库层完成join操作,必须通过代码实现
  • 现象:程序运行时抛出KeyError: '220004340180'错误

测试用字典

apro字典

{'220005124956': ('220005124956', '0460', '655', 'N', 1008, '68547', 'N'), '220004340180': ('220004340180', '0110', '621', 'N', 1008, '13001',  'N'), '220005432952': ('220005432952', '0511', '0', 'S', 1008, '66170', 'S')}

qval字典

{'220005124956': ('220005124956', 57, 57, 'Viable', '22/03/19', '30/01/77', 'SOLICITANTE', 4), '220001563164': ('220001563164',  0, 103, 'Viable', '28/06/19', '14/08/53','DEUDOR SOLIDARIO', 1), '220002018427': ('220002018427',  31, 134, 'Viable', '23/05/19', '07/04/61', 'SOLICITANTE', 3), '220002389190': ('220002389190',  0, 52, 'Viable', '27/03/19', '26/04/63', 'SOLICITANTE', 2), '220005432952': ('220005432952', 23, 23, 'Viable', '06/06/19', '03/11/79',  'SOLICITANTE', 3), '220002392626': ('220002392626', 15, 15, 'Viable', '23/02/21', '23/09/67', 'SOLICITANTE', 3), '220003040975': ('220003040975', 23, 153, 'Viable', '05/03/21', '06/01/58', 6, 'SOLICITANTE', 4), '220004790251': ('220004790251', 20, 20, 'Viable', '09/07/19', '01/01/54', 'SOLICITANTE', 1), '220003721210': ('220003721210', 20, 21, 'Viable', '05/12/19', '15/11/84','SOLICITANTE',  3), '220003799655': ('220003799655', 0, 0, 'Viable', '25/06/21', '20/03/72', 'SOLICITANTE', 1), '220003800434': ('220003800434', 21, 162, 'Viable', '16/11/21', '13/07/66', 'SOLICITANTE', 1), '220003851821': ('220003851821', 24, 22, 'Viable', '09/09/19', '18/10/81', 'SOLICITANTE', 2), '220003851944': ('220003851944', 8, 12, 'Viable', '27/09/19', '22/12/64','SOLICITANTE', 3), '220004430315': ('220004430315', 18, 39, 'Viable', '07/10/21', '14/02/53', 'SOLICITANTE', 1), '220004504137': ('220004504137', 40, 54, 'Viable', '19/03/19', '08/03/86','SOLICITANTE', 1), '220004510839': ('220004510839',  0, 98, 'Viable', '12/10/19', '10/02/72','SOLICITANTE', 3), '220004511887': ('220004511887', 23, 137, 'Viable', '14/01/20', '05/05/59', 'SOLICITANTE', 1)}

报错信息

Traceback (most recent call last):
  File "\adherencia.py", line 172, in <module>
    Base_adherencia()
  File "\adherencia.py", line 151, in adherencia
    res[key].append(apro + '', '', '', '')
KeyError: '220004340180'

原有问题代码

def UnirDic():
    apro = {}
    for row in pcorte: ##pcorte为SQL查询返回结果
        apro[row[0]] = row
      
    val = Validaciones() ##Validaciones为SQL查询返回结果
    qval = {}
    for row in val:
        qval[row[0]]=row
    
    res = {}   

    for key, apro_row in apro.items():        
        qval_row = qval[key] if key in qval else res[key].append(apro + [qval_row[1], qval_row[2], qval_row[4], qval_row[7]])
        res[key].append(apro + '', '', '', '')
        
    for key, apro_row in res.items():
        print(key,apro_row)

错误原因

  • 三元判断逻辑写反:键不存在于qval时,反而尝试访问未初始化的res[key]和未定义的qval_row变量
  • 类型错误:元组不能直接和字符串用+拼接,apro + ''属于非法操作
  • 未初始化键直接操作:res初始为空字典,没有提前创建对应key的存储结构就直接调用append方法,触发KeyError
  • 逻辑冗余错误:两次append操作重复,分支和处理逻辑完全不匹配

修正后代码

def UnirDic():
    apro = {}
    for row in pcorte: ##pcorte为SQL查询返回结果
        apro[row[0]] = row
      
    val = Validaciones() ##Validaciones为SQL查询返回结果
    qval = {}
    for row in val:
        qval[row[0]] = row
    
    res = {}   
    for key, apro_row in apro.items():
        # 匹配到qval的键时取指定字段,否则填充空默认值
        if key in qval:
            qval_row = qval[key]
            extra_fields = (qval_row[1], qval_row[2], qval_row[4], qval_row[7])
        else:
            extra_fields = ('', '', '', '')
        # 同类型元组拼接后直接赋值,避免append触发的KeyError
        res[key] = apro_row + extra_fields
        
    for key, merged_row in res.items():
        print(key, merged_row)

修正说明

  • 拆分三元表达式为清晰的if/else分支,避免逻辑写反,同时解决变量未定义的问题
  • 统一拼接的数据类型为元组,消除元组和字符串直接相加的类型错误
  • 直接给res[key]赋值最终合并结果,不需要初始化空列表再调用append,从根源避免KeyError
  • 移除重复的错误append逻辑,一次赋值完成字段合并

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 20:15:52