创建多层字典(JSON)时数据被覆盖的问题求助
解决多层字典赋值时覆盖旧数据的问题
你的代码核心问题是每次循环直接替换上层字典,导致之前生成的层级数据被覆盖。比如执行dict1[i] = {j:{k:{"fruit":m,"animal":n}}}时,dict1[i]会被重新赋值为全新的字典,之前为该i创建的所有j、k层级都会被丢弃,最终每个i只保留最后一次循环的结果。
原始问题代码
dict1 = {} for i in ["i","you"]: for j in ["have", "has", "had"]: for k in ["a","an"]: for m in ["apple", "pear"]: for n in ["cat","dog"]: dict1[i] = {j:{k:{"fruit":m,"animal":n}}} print(dict1)
解决方案
方法1:手动检查并初始化层级
逐层判断每个层级的键是否存在,不存在则创建空字典,确保上层结构不被覆盖:
dict1 = {} for i in ["i","you"]: if i not in dict1: dict1[i] = {} for j in ["have", "has", "had"]: if j not in dict1[i]: dict1[i][j] = {} for k in ["a","an"]: if k not in dict1[i][j]: dict1[i][j][k] = {} # 直接为最内层键赋值,不修改上层结构 dict1[i][j][k]["fruit"] = m dict1[i][j][k]["animal"] = n
方法2:使用dict.setdefault()简化初始化
setdefault()方法会自动处理键的存在性检查,不存在则创建默认值并返回,代码更简洁:
dict1 = {} for i in ["i","you"]: for j in ["have", "has", "had"]: for k in ["a","an"]: for m in ["apple", "pear"]: for n in ["cat","dog"]: # 逐层获取或创建字典 level1 = dict1.setdefault(i, {}) level2 = level1.setdefault(j, {}) level3 = level2.setdefault(k, {}) # 赋值最内层键值对 level3["fruit"] = m level3["animal"] = n
方法3:递归defaultdict自动创建层级
通过递归定义的defaultdict,可以自动生成缺失的层级,无需手动检查:
from collections import defaultdict def nested_dict(): return defaultdict(nested_dict) dict1 = nested_dict() for i in ["i","you"]: for j in ["have", "has", "had"]: for k in ["a","an"]: for m in ["apple", "pear"]: for n in ["cat","dog"]: # 直接赋值,自动创建缺失层级 dict1[i][j][k]["fruit"] = m dict1[i][j][k]["animal"] = n # 可选:转换为普通字典(若不需要defaultdict特性) dict1 = dict(dict1) print(dict1)
注意事项
如果需要同一个i/j/k组合下保留多组fruit/animal,可以将最内层改为列表,例如:
level3.setdefault("items", []).append({"fruit": m, "animal": n})
内容的提问来源于stack exchange,提问作者Douglas Sim
相关产品推荐
相关产品推荐

