明明字典中存在对应键,为何仍触发KeyError异常?
字典反向货币对KeyError问题排查
问题背景
需求是检查字典中某一货币对键的反向货币对是否存在,例如('EUR', 'USD')的反向为('USD', 'EUR')。但运行代码时明明反向货币对存在,却触发KeyError: '('IDR', 'EUR')'。
复现代码
dict_example={('EUR', 'IDR'): None, ('EUR', 'BGN'): None, ('EUR', 'CHF'): None, ('EUR', 'USD'): None, ('IDR', 'EUR'): None, ('IDR', 'BGN'): None, ('IDR', 'CHF'): None, ('IDR', 'USD'): None, ('BGN', 'EUR'): None, ('BGN', 'IDR'): None, ('BGN', 'CHF'): None, ('BGN', 'USD'): None, ('CHF', 'EUR'): None, ('CHF', 'IDR'): None, ('CHF', 'BGN'): None, ('CHF', 'USD'): None, ('USD', 'EUR'): None, ('USD', 'IDR'): None, ('USD', 'BGN'): None, ('USD', 'CHF'): None} for i in dict_example.keys(): print(i) a='(\'{}\', \'{}\')'.format(i[1], i[0]) print(dict_example[a])
问题原因
字典dict_example的键是元组类型(比如('EUR', 'IDR')),但代码里通过format生成的变量a是字符串类型(比如"('IDR', 'EUR')")。两者类型完全不同,即便字符串内容看起来和元组一样,字典也会判定为不同的键,因此触发KeyError。
解决方法
直接生成元组类型的反向货币对,不需要转换成字符串:
dict_example={('EUR', 'IDR'): None, ('EUR', 'BGN'): None, ('EUR', 'CHF'): None, ('EUR', 'USD'): None, ('IDR', 'EUR'): None, ('IDR', 'BGN'): None, ('IDR', 'CHF'): None, ('IDR', 'USD'): None, ('BGN', 'EUR'): None, ('BGN', 'IDR'): None, ('BGN', 'CHF'): None, ('BGN', 'USD'): None, ('CHF', 'EUR'): None, ('CHF', 'IDR'): None, ('CHF', 'BGN'): None, ('CHF', 'USD'): None, ('USD', 'EUR'): None, ('USD', 'IDR'): None, ('USD', 'BGN'): None, ('USD', 'CHF'): None} for i in dict_example.keys(): print(i) a = (i[1], i[0]) # 直接生成元组 print(dict_example[a])
这样a的类型和字典键的类型一致,就能正确匹配到对应的反向货币对键。
内容的提问来源于stack exchange,提问作者Meriole
相关产品推荐
相关产品推荐

