Python 动态地在dict中设置一个深度值
如果我有一个嵌套的dictPython 动态地在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
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'}}}