更新一个多维字典的字典。

3
我正在尝试更新一个具有不确定深度的字典中的值,这个字典是通过h5py加载的。作为MWE,可以尝试:
C = {'A':{'B':12, 'C':13, 'D':{'E':20}}, 'F':14, 'G':{'H':15}}

当我想将“E”的值设置为42时,我会使用以下代码:
C['A']['D']['E'] = 42

这部分很容易,现在假设我正在尝试为用户提供的字典设置一个值,形式为:
([keys], value) -> e.g. (['A','D','E'], 42)

“我该如何设置这个值?我需要为每个可能的深度编写一个 setter 函数吗?”
“我尝试使用字典的 update 函数来实现:”
def dod(keys, value):
""" Generate a dict of dicts from a list of keys and one value """
if len(keys) == 1:
    return {keys[0]: value}
else:
    return {keys[0]: dod(keys[1:], value)}

C.update(dod(['A', 'D', 'E'], 42)

但是使用这个会删除从第二层开始的所有元素,结果如下:
C = {'A': {'D': {'E': 42}}, 'G': {'H': 15}, 'F': 14}

我犯了一个错误还是有更简单的方法来设置未知深度的值?
1个回答

2

这个答案只是针对你特定示例中找到的方法实施:

此处
from functools import reduce
import operator

def getFromDict(dataDict, mapList):
    return reduce(operator.getitem, mapList, dataDict)

def setInDict(dataDict, mapList, value):
    getFromDict(dataDict, mapList[:-1])[mapList[-1]] = value

C = {'A':{'B':12, 'C':13, 'D':{'E':20}}, 'F':14, 'G':{'H':15}}

setInDict(C, ['A','D','E'], 42)

print(C)

产生:

{'A': {'B': 12, 'C': 13, 'D': {'E': 42}}, 'F': 14, 'G': {'H': 15}}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接