Python在嵌套字典中总结值

时间:2017-11-01 02:56:31

标签: python dictionary nested

我有一个字典P,它代表字典中字典中的字典。它看起来像这样。

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

我要做的是根据totalPopulation的百分比从任何基本密钥中写出value1,value 2的每个值。

例如,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)}

我不确定的是如何迭代这个字典并只收集某个键的最内层值,这样我就可以将所有值相加并将每个值除以该总和。

2 个答案:

答案 0 :(得分:1)

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

这应该做你想要的。我只包括" key1"在这个例子中。

答案 1 :(得分:1)

这可以使用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()}

以上更具可读性的版本:

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()
    }

<强>输出

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

唯一的问题是总和是重复计算的,您可以通过计算每个key1key2 ...之前的总和来解决这个问题,然后使用存储的相反,如下所示:

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

然后您可以通过键访问上面计算的总和,如下所示:

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()}