n深度树:根据子值设置父值

时间:2018-03-19 18:02:00

标签: python

n-depth dict中,在层次结构的最深层设置值:

{
    "name": "root",
    "value": None, # expected value to be 80
    "children": [
        {
            "name": "a",
            "value": None, # expected value to be 30
            "children": [
                { "name": "a.1", "value": 10 },
                { "name": "a.2", "value": 20 }
            ]
        },
        {
            "name": "b",
            "value": None, # expected value to be 50
            "children": [
                { "name": "b.1", "value": 25 },
                {
                    "name": "b.2",
                    "value": None, # expected value to be 25
                    "children": [
                        {"name": "b.2.1", "value": 5},
                        {"name": "b.2.2", "value": 5},
                        {"name": "b.2.3", "value": 5},
                        {"name": "b.2.4", "value": 5},
                        {"name": "b.2.5", "value": 5}
                    ]
                }
            ]
        }
    ]
}

根据用其子value(即总和)执行的操作的结果,递归设置每个父value的方法是什么?

2 个答案:

答案 0 :(得分:0)

鉴于您的数据结构和要更新的值列表,您可以在递归中使用next

def update(d, targets):
   return {a:[update(i, targets) for i in b] if isinstance(b, list) else update(b, targets) if isinstance(b, dict) else next(targets) if not b else b for a, b in d.items()}

targets = [80, 30, 50, 25]
results = update(nlist, iter(targets))

输出:

{'children': [{'children': [{'name': 'a.1', 'value': 10},
                        {'name': 'a.2', 'value': 20}],
           'name': 'a',
           'value': 30},
          {'children': [{'name': 'b.1', 'value': 25},
                        {'children': [{'name': 'b.2.1', 'value': 5},
                                      {'name': 'b.2.2', 'value': 5},
                                      {'name': 'b.2.3', 'value': 5},
                                      {'name': 'b.2.4', 'value': 5},
                                      {'name': 'b.2.5', 'value': 5}],
                         'name': 'b.2',
                         'value': 25}],
           'name': 'b',
           'value': 50}],
 'name': 'root',
 'value': 80}

答案 1 :(得分:0)

我终于设法使用迭代aws.github.io/aws-amplify来完成它,我只缺少一些细节。

这种方法有效,因为深度迭代顺序是有保证的,所以一旦我们到达一个节点它有孩子,它的所有子级子节点都已经计算好了。

解决方案:

API.get(...)

结果:

{
    Authorization: 'myToken'
}