鉴于你有一个空字典
data = {}
我有路径和值
path = "root.sub.item"
value = 12
我怎样才能递归添加不存在的对象?
def add_value(path, value):
for part in path.split('.'):
if not part in data:
data[part] = {}
此预期输出为:
data = {
'root':{
'sub':{
'item': 12
}
}
}
有人可以帮忙解决这个问题,还是指出正确的方向? 我使用的是Python 3.6。
答案 0 :(得分:0)
你几乎就在那里,你只需要跟踪你对树结构的距离,以及了解你何时进入路径最后一个元素的方法:
def add_value(path, value):
tmp = data
parts = list(path.split('.'))
for i in range(len(parts) - 1):
part = parts[i]
if not part in tmp:
tmp[part] = {}
tmp = tmp[part]
tmp[parts[-1]] = value
答案 1 :(得分:0)
您可以使用其他类型的解决方案,如递归defaultdict,如this answer。
一个关于它如何使用的快速而愚蠢的例子:
from collections import defaultdict
def func(rdict, path, value):
items = path.split('.')
d = rdict[items[0]]
for item in items[1:-1]:
d = d[item]
d[items[-1]] = value
nested_dict = lambda: defaultdict(nested_dict)
result = nested_dict()
func(result, 'root.sub.item', 12)
func(result, 'root.moon.value', 1)
assert result['root']['sub']['item'] == 12
assert result['root']['moon']['value'] == 1
assert result['root']['moon']['noop'] != 0
答案 2 :(得分:0)
你可以尝试Raymond Hettinger食谱:
来源:https://twitter.com/raymondh/status/343823801278140417
from collections import defaultdict
infinity_dict=lambda:defaultdict(infinity_dict)
d=infinity_dict()
d['root']['sub']['item'] = 12