Python 获取嵌套字典的嵌套值之和

Python 获取嵌套字典的嵌套值之和,python,dictionary,nested,Python,Dictionary,Nested,我有一本嵌套字典 dict_features = {'agitacia/6.txt': {'samoprezentacia': 0, 'oskorblenie': 1}, 'agitacia/21.txt': {'samoprezentacia': 0, 'oskorblenie': 0}} 我正在尝试输出一个新的字典features\u agit\u sum,它由一个来自以前字典的键和一个“更深层”字典的值的总和组成。所以我需要求和0+1,这是int

我有一本嵌套字典

 dict_features =  {'agitacia/6.txt': {'samoprezentacia': 0, 'oskorblenie': 1},
                   'agitacia/21.txt': {'samoprezentacia': 0, 'oskorblenie': 0}}
我正在尝试输出一个新的字典
features\u agit\u sum
,它由一个来自以前字典的键和一个“更深层”字典的值的总和组成。所以我需要求和0+1,这是int类型。输出应为:

{'agitacia/6.txt': 1, 'agitacia/21.txt': 0}
以下是几种不同错误的尝试;不知道如何正确迭代:

features_agit_sum = {}
def vector_agit_sum(dict_features):
    for key, value in dict_features:
        features_agit_sum[key] = sum(dict_features.items()[key])
        print (features_agit_sum)
    return features_agit_sum
ValueError:要解压缩的值太多(应为2个) dict_features.items()[key]-尝试访问更深的dict

TypeError:不支持+:“int”和“str”的操作数类型-为什么, 是整数

TypeError:“dict_items”对象不可订阅


使用
isinstance
检查类型并采取正确的操作。如果是
int
,则将其添加到运行总数中。否则,递归以获取该字典中包含的总和

dict_features =  {'agitacia/6.txt': {'samoprezentacia': 0, 'oskorblenie': 1}, 'agitacia/21.txt': {'samoprezentacia': 0, 'oskorblenie': 0}}

def countDict(d):
    total = 0
    for i in d.itervalues():
        if isinstance(i,int):
            total += i
        else:
            total += countDict(i)
    return total



result = {}
for k,v in dict_features.iteritems():

    result[k] = countDict(v)

print result
最短(和最快)的方式可能是:

features_agit_sum = dict([(k, sum(dict_features[k].values())) for k, v in dict_features.iteritems()])

使用听写理解:

{key: sum(value.itervalues()) for key, value in dict_features.iteritems()}
如果您使用的是Python 3,请删除
iter
前缀,因此使用
.values()
.items()

演示:


尝试使用字典理解(这在Python 2.7+和3.x中都适用):

如果使用Python 2.7+,建议显式使用迭代器,在Python 3.x中,前面的代码段已经使用了迭代器:

{ k : sum(v.itervalues()) for k, v in dict_features.iteritems() }
无论哪种方式,它都会返回预期结果:

{'agitacia/21.txt': 0, 'agitacia/6.txt': 1}
>>> dict_features =  {'agitacia/6.txt': {'samoprezentacia': 0, 'oskorblenie': 1}, 'agitacia/21.txt': {'samoprezentacia': 0, 'oskorblenie': 0}}
>>> {key: sum(value.itervalues()) for key, value in dict_features.iteritems()}
{'agitacia/21.txt': 0, 'agitacia/6.txt': 1}
{ k : sum(v.values()) for k, v in dict_features.items() }
{ k : sum(v.itervalues()) for k, v in dict_features.iteritems() }
{'agitacia/21.txt': 0, 'agitacia/6.txt': 1}