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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 04:55:56