【问题标题】:Python summing up values in a nested dictionaryPython总结嵌套字典中的值
【发布时间】:2026-01-28 13:30:01
【问题描述】:

我有一个字典 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{...:{...:}}}

我想要做的是将 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)}

我不确定的是如何遍历这个字典并只收集某个键的最里面的值,这样我就可以总结所有值并将每个值除以该总和。

【问题讨论】:

  • 可以有任何级别的嵌套还是固定的?
  • @Ashish Ranjan 是固定级别的嵌套,但不是固定数量的值。总会有keyA和keyB,但是这些key对应的字典可以有任意数量的值
  • 请展示更多您的代码。此外,如果您的键或值名称没有引用已经实例化的对象,它们应该是 strings
  • @Leyton 有什么反馈吗?成功了吗?
  • @Ashish Ranjan 是的,非常感谢!

标签: python dictionary nested


【解决方案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}}}

唯一的问题是总和是重复计算的,您可以通过在此 dict 理解之前计算每个 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()}

【讨论】:

    【解决方案2】:
    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”。

    【讨论】: