使用defaultdict构建嵌套字典时列表追加报KeyError问题求助
解决多级defaultdict的列表追加问题
你的问题出在主字典的默认值是普通dict:当你访问my_dict['foo']时,确实会自动生成一个空dict,但这个普通字典没有自动生成列表的能力,所以访问它的'bar'键时就会触发KeyError。
要实现「主字典键为字符串,值为二级字典;二级字典键为字符串,值为列表」的结构,需要让二级字典也是defaultdict(list),这样访问二级字典不存在的键时会自动创建空列表。
正确代码示例
import collections # 主字典的默认值是生成defaultdict(list)的lambda函数 my_dict = collections.defaultdict(lambda: collections.defaultdict(list)) # 直接追加值,不会报错 my_dict['foo']['bar'].append('1') print(my_dict) # 输出示例: defaultdict(<function <lambda> at 0x...>, {'foo': defaultdict(<class 'list'>, {'bar': ['1']})})
如果需要保留初始的missing_key键
如果你需要保留原代码里的{'missing_key': []}初始结构,可以在创建defaultdict后手动添加:
import collections my_dict = collections.defaultdict(lambda: collections.defaultdict(list)) # 添加初始键值对 my_dict['missing_key'] = [] my_dict['foo']['bar'].append('1') print(my_dict) # 输出示例: defaultdict(<function <lambda> at 0x...>, {'missing_key': [], 'foo': defaultdict(<class 'list'>, {'bar': ['1']})})
原理说明
- 外层
defaultdict的默认工厂函数是lambda: collections.defaultdict(list),意味着外层字典遇到不存在的键时,会自动生成一个能自动创建空列表的二级字典。 - 当访问二级字典的不存在的键(比如
'bar')时,二级的defaultdict(list)会自动生成空列表,此时调用append()就不会报错。
内容的提问来源于stack exchange,提问作者Mikef
相关产品推荐
相关产品推荐

