嵌套插入/创建字典



假设你有一个空字典

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。

您可以使用另一种解决方案,例如递归默认,如本答案所示。

一个关于如何使用它的快速而愚蠢的例子:

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

你快到了,你只需要跟踪你进入树结构的距离,以及一种知道你何时在路径的最后一个元素的方法:

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

你可以试试雷蒙德·赫廷格的食谱:

来源: https://twitter.com/raymondh/status/343823801278140417

from collections import defaultdict
infinity_dict=lambda:defaultdict(infinity_dict)
d=infinity_dict()
d['root']['sub']['item'] = 12

最新更新