Python中如何将带点分隔键的扁平字典转换为嵌套字典?问题求助及解决方案
如何将带圆点分隔键的扁平字典转换为多层嵌套字典?
我来帮你搞定这个问题!你想要把用圆点分隔键的扁平字典转换成多层嵌套结构,比如把{'deployment.easset': 'name', 'deployment.service.source': 'service'}转换成对应的嵌套字典对吧?先说说你原来代码的问题:
你写的代码里,每次循环拆分后的键片段时,直接给diccionary[i]赋值为[value],这会不断覆盖之前的键值,而且完全没有创建嵌套的字典结构,最后自然得不到你想要的多层效果。
可行的解决方案
这里有个能正确实现转换的函数,不管你的键有多少个层级都能处理:
def insert(data): res = {} for k, v in data.items(): res_tmp = res levels = k.split(".") # 遍历除最后一层外的所有键,逐步构建嵌套字典 for level in levels[:-1]: # setdefault方法:键不存在就创建空字典,存在则返回已有值,完美适配嵌套场景 res_tmp = res_tmp.setdefault(level, {}) # 给最内层的键赋值 res_tmp[levels[-1]] = v return res # 测试你的示例 result = insert({'deployment.easset': 'name', 'deployment.service.source': 'service'}) print(result) # 输出结果:{'deployment': {'easset': 'name', 'service': {'source': 'service'}}} # 测试更深层级的键 deep_result = insert({'deployment.easset.cosa.pepe.juan': 'name'}) print(deep_result) # 输出:{'deployment': {'easset': {'cosa': {'pepe': {'juan': 'name'}}}}}
代码逻辑拆解
- 先初始化一个空字典
res,用来存最终的嵌套结果 - 遍历原始字典的每一组键值对:
- 把带圆点的键按
.拆分成层级列表,比如'deployment.service.source'会变成['deployment', 'service', 'source'] - 用
res_tmp作为当前层级的临时引用,一开始指向最外层的res - 遍历除最后一个层级外的所有键,用
setdefault方法一步步深入:如果当前层级的键不存在,就创建一个空字典并让res_tmp指向它;如果已经存在,就直接让res_tmp指向已有的字典 - 最后把值赋给最内层的那个键,完成这一组键值对的嵌套转换
- 把带圆点的键按
这样就能完美实现你想要的效果啦!
内容的提问来源于stack exchange,提问作者Andres Lorenzo Carvia
相关产品推荐
相关产品推荐

