嵌套插入/创建字典

时间:2018-04-17 13:58:10

标签: python python-3.x dictionary recursion defaultdict

鉴于你有一个空字典

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。

3 个答案:

答案 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