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

如何创建支持未存在键自增(默认值为0)的嵌套字典?

实现支持自增操作的嵌套字典

当然可以做到!你之前提到用collections.defaultdict只能直接赋值,那是因为只用到了单层的defaultdict,只要对它进行嵌套使用,就能实现「键不存在时默认值为0,执行自增后变为1」的需求。

方法1:明确层级的嵌套defaultdict

如果你的字典固定是三层(比如mydict[x][y][z]),可以直接嵌套三层defaultdict,最内层指定为int类型(默认值0):

from collections import defaultdict

# 定义三层嵌套的默认字典
mydict = defaultdict(lambda: defaultdict(lambda: defaultdict(int)))

# 直接对不存在的键执行自增操作
mydict["foo"]["bar"]["baz"] += 1
print(mydict["foo"]["bar"]["baz"])  # 输出:1

原理很简单:

  • 当访问mydict["foo"]时,因为键不存在,会自动生成一个defaultdict(lambda: defaultdict(int))作为值;
  • 接着访问mydict["foo"]["bar"],同样会生成一个defaultdict(int);
  • 最后访问mydict["foo"]["bar"]["baz"],因为最内层是defaultdict(int),不存在的键会返回0,执行+=1后就变成1了。

方法2:支持任意层级的递归defaultdict

如果你的字典层级不固定,想要支持任意多层嵌套,可以写一个递归生成函数:

from collections import defaultdict

def nested_int_dict():
    # 递归生成嵌套的defaultdict,最内层为int类型
    return defaultdict(nested_int_dict)

mydict = nested_int_dict()

# 不管多少层都能直接自增
mydict["a"]["b"]["c"]["d"] += 1
print(mydict["a"]["b"]["c"]["d"])  # 输出:1

这个方法的好处是不用提前固定层级,不管你需要几层嵌套,都能自动生成对应的结构,最内层始终会返回int的默认值0,完美支持自增操作。

补充:为什么之前的方法不行?

你之前看到的「只能执行mydict[x][y][z] = 1」的情况,应该是只定义了单层的defaultdict,比如只做了defaultdict(dict),这样当访问深层键时,中间层的键不存在会抛出KeyError,自然没法直接自增。而嵌套的defaultdict会自动为每一层不存在的键生成对应的默认结构,解决了这个问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:05:15