嵌套 insertion/creation 个字典

Nested insertion/creation of dictionary

假设你有一个空字典

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.

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

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

您可以使用另一种解决方案,例如 this answer 中的递归 defaultdict。

关于如何使用它的快速而愚蠢的示例:

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

你可以试试 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