python中的分层求和

时间:2015-07-09 10:15:24

标签: python recursion

给出以下数组:

a = []
a.append({'c': 1, 'v': 10, 'p': 4})
a.append({'c': 2, 'v': 10, 'p': 4})
a.append({'c': 3, 'v': 10, 'p': None})
a.append({'c': 4, 'v': 0, 'p': None})
a.append({'c': 5, 'v': 10, 'p': 1})
a.append({'c': 6, 'v': 10, 'p': 1})

其中c =代码,v = value,p = parent 表看起来像那样:

c v   p
1     4
2 10  4
3 10
4
5 10  1
6 10  1

我必须总结每个家长的价值观 预期结果表将是:

c v   p
1 20  4
2 10  4
3 10
4 30
5 10  1
6 10  1

如何实现这一目标?

1 个答案:

答案 0 :(得分:0)

首先,您应该派生另一个字典,将父母映射到他们孩子的列表,而不是孩子的父母。您可以使用collections.defaultdict

from collections import defaultdict
children = defaultdict(list)
for d in a:
    children[d["p"]].append(d["c"])

另外,我建议使用另一个字典,将代码映射到它们的值,这样您就不必每次都搜索整个列表:

values = {}
for d in a:
    values[d["c"]] = d["v"]

现在,您可以非常轻松地定义用于计算总值的递归函数。但请注意,这将进行一些冗余计算。如果您的数据要大得多,您可能希望通过使用一些记忆来避免这种情况。

def total_value(x):
    v = values[x]
    for c in children[x]:
        v += total_value(c)
    return v

最后,在dict理解中使用此函数可以得到每个代码的总值:

>>> {x: total_value(x) for x in values}
{1: 30, 2: 10, 3: 10, 4: 40, 5: 10, 6: 10}