如何创建支持未存在键自增(默认值为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
相关产品推荐
相关产品推荐

