给出以下数组:
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
如何实现这一目标?
答案 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}