我正在尝试更新不确定深度的词典字典中的值。该词典词典通过h5py加载。作为MWE,您可以尝试:
C = {'A':{'B':12, 'C':13, 'D':{'E':20}}, 'F':14, 'G':{'H':15}}
所以当我想将'E'的值设置为42时,我会使用
C['A']['D']['E'] = 42
这部分很简单,所以现在让我们假设我试图在此dict中设置一个由用户以以下形式提供的值:
([keys], value) -> e.g. (['A','D','E'], 42)
如何设置此值?是否必须为每个可能的深度编写一个setter函数?
我尝试使用dict的更新功能,如下所示:
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}
我是否犯了一个错误,还是有一种更简单的方法来设置深度未知的值?
答案 0 :(得分:2)
此答案只是实现了针对您的特定示例在here中找到的方法:
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}}