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
相关产品推荐
相关产品推荐

