Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 更新多维词典_Python_Dictionary - Fatal编程技术网

Python 更新多维词典

Python 更新多维词典,python,dictionary,Python,Dictionary,我正在尝试更新深度不确定的词典中的值。本词典通过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)

我正在尝试更新深度不确定的词典中的值。本词典通过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)
但使用此选项将删除从深度2开始的所有元素,从而导致:

C = {'A': {'D': {'E': 42}}, 'G': {'H': 15}, 'F': 14}

我是否犯了错误,或者是否有更简单的方法来设置深度未知的值?

此答案只是实现了为您的特定示例找到的方法:

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}}