简体   繁体   English

Python对嵌套字典中的值求和

[英]Python summing up values in a nested dictionary

I have a dictionary P which represents a dictionary within a dictionary within a dictionary. 我有一个字典P,它表示字典中字典中的字典。 It looks something like this. 看起来像这样。

P={key1:{keyA:{value1: 1, value2:3}, keyB:{value1:3,value2:4}}, 
key2:{keyA:{value1: 1, value2:3}, keyB:{value1:3,value2:4}}, key3{...:{...:}}}

What I am trying to do is to write each value of value1,value 2 in terms of their percentages of the totalPopulation from whichever is there base key. 我想要做的是根据存在的基键中的任意一个,以value1,value 2的每个值的形式写成它们在totalPopulation中所占的百分比。

For example key1 should look like 例如key1应该看起来像

key1:{keyA:{value1: 1/(1+3+3+4), value2:3/(1+3+3+4)}, keyB:
{value1:3/(1+3+3+4),value2:4/(1+3+3+4)}

What I am not sure about is how to iterate over this dictionary and only collect the innermost values of a certain key so I can then sum up all the values and divide each value by that sum. 我不确定如何在此字典上进行迭代并仅收集某个键的最内层值,因此我可以将所有值求和,然后将每个值除以该和。

test = {"key1":{"keyA":{"value1": 1, "value2":3}, "keyB":{"value1":3,"value2":4}}}

for a in test:
        s = 0
        for b in test[a]:
            for c in test[a][b]:
                s += test[a][b][c]
        print(s)
        for b in test[a]:
            for c in test[a][b]:
                test[a][b][c] = test[a][b][c] / s

This should do what you want. 这应该做您想要的。 I've only included "key1" in this example. 在此示例中,我仅包括了“ key1”。

This can be done in single line using dict comprehension and map like this: 可以使用dict comprehensionmap在单行中完成,如下所示:

#from __future__ import division # use for Python 2.x
p = {"key1":{"keyA":{"value1": 1, "value2":3}, "keyB":{"value1":3,"value2":4}}}

p = {kOuter:{kInner:{kVal: vVal/sum(map(lambda x: sum(x.values()), vOuter.values())) for kVal, vVal in vInner.iteritems()} for kInner, vInner in vOuter.iteritems()} for kOuter, vOuter in p.iteritems()}

A more readable version of above : 上面的内容更具可读性:

p = {
        kOuter:{
            kInner:{
                kVal: vVal/sum(map(lambda x: sum(x.values()), vOuter.values())) for kVal, vVal in vInner.iteritems()
            } 
            for kInner, vInner in vOuter.iteritems()
        } 
        for kOuter, vOuter in p.iteritems()
    }

OUTPUT OUTPUT

>>> p
>>> 
{'key1': {'keyB': {'value2': 0.36363636363636365, 'value1': 0.2727272727272727}, 'keyA': {'value2': 0.2727272727272727, 'value1': 0.09090909090909091}}}

The only problem with this is that the sum is calculated repeatedly, you can fix that by calculating the sum for each of your key1 , key2 ... before this dict comprehension and use the stored values instead, like this : 唯一的问题是,总和是重复计算的,您可以通过在此dict理解之前为key1key2 ...中的每一个计算总和来解决此问题,并改用存储的值,如下所示:

keyTotals = {kOuter:sum(map(lambda x: sum(x.values()), vOuter.values())) for kOuter, vOuter in p.iteritems()}

and then you can simply access the sums calculated above by keys, like this: 然后您可以简单地访问通过键计算的上述总和,如下所示:

p = {kOuter:{kInner:{kVal: vVal/keyTotals[kOuter] for kVal, vVal in vInner.iteritems()} for kInner, vInner in vOuter.iteritems()} for kOuter, vOuter in p.iteritems()}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM