Python 动态地在dict中设置一个深度值

Python 动态地在dict中设置一个深度值,python,Python,如果我有一个嵌套的dictd={'a':{'b':{}}和一个字符串'a.b.c'和一个值'X' 我需要根据键字符串将值放入dict中 我想要实现的可以硬编码为d['a']['b']['c']='X',但我需要动态地完成。键串可以是任意长度 奖励积分:如果密钥不存在,我还需要创建密钥,比如'a.b.z',但我确信如果我能找出它们已经存在的情况,我可以找到答案 def recursedict(d,keylist,value=None): key = keylist.pop(0) # rem

如果我有一个嵌套的dict
d={'a':{'b':{}}
和一个字符串
'a.b.c'
和一个值
'X'

我需要根据键字符串将值放入dict中

我想要实现的可以硬编码为
d['a']['b']['c']='X'
,但我需要动态地完成。键串可以是任意长度

奖励积分:如果密钥不存在,我还需要创建密钥,比如
'a.b.z'
,但我确信如果我能找出它们已经存在的情况,我可以找到答案

def recursedict(d,keylist,value=None):
    key = keylist.pop(0) # removes and returns the first key
    if len(keylist): # True if there are more levels to go down
        try: assert type(d[key]) is dict
        except KeyError: d[key] = dict()
        except AssertionError: raise ValueError("d[{}] is a {}".format(key,type(d[key])))
        # if d[key] doesn't exist, make it a dict()
        # if d[key] DOES exist, and isn't a dict, raise a KeyError

        recursedict(d[key],keylist,value)
        # recurse
    else:
        if value is None:
            return d[key]
        else:
            d[keylist[0]] = value
            return value

def setdeepdict(d,attributestr,value): # double entendre intentional
    keys = attributestr.split('.')
    recursedict(d,keys,value)

def getdeepdict(d,attributestr): # double entendre SUPER intentional
    keys = attributestr.split('.')
    recursedict(d,keys)
结果:

{'a': {'b': {'c': 'X', 'd': 'Y'}}}

用你自己的话说,这个过程中的关键步骤是什么?你认为你能做什么?非常好地使用
setdefault
!这比我的实现好几英里,哪怕只是因为缺少递归。我总是忘记它会返回它设置的值——我花了很久才弄明白你是如何筑巢的。这太棒了!为什么在函数中使用
dd
?如果直接使用
d
,会有什么中断?只是好奇…你是对的。没有理由。它在没有临时变量的情况下工作。如果您希望设置
,即使之前的值已经存在,也可以将第二个
设置默认值
调用更改为
dd[latest]=值
{'a': {'b': {'c': 'X', 'd': 'Y'}}}