2

我有一个嵌套字典

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

我正在尝试输出一个新字典features_agit_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

features_agit_sum = {}
def vector_agit_sum(dict_features):
    for key in dict_features:
        for item, value in dict_features.items():
            features_agit_sum[key] = sum([item])
            print (features_agit_sum)
    return features_agit_sum

类型错误:+ 的不支持的操作数类型:'int' 和 'str' - 为什么,它是整数!

features_agit_sum = {}
def vector_agit_sum(dict_features):
    files = dict_features.keys()
    for key, value in dict_features.items():
        features_agit_sum[files] = sum(dict_features.items()[key])
        print (features_agit_sum)
    return features_agit_sum

TypeError:“dict_items”对象不可下标

4

4 回答 4

3

使用 dict 理解:

{key: sum(value.itervalues()) for key, value in dict_features.iteritems()}

如果您使用的是 Python 3,请删除iter前缀,因此请使用.values()and .items()

演示:

>>> 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}
于 2013-08-03T14:13:43.073 回答
3

试试这个,使用字典理解(这将在 Python 2.7+ 和 3.x 中工作):

{ k : sum(v.values()) for k, v in dict_features.items() }

如果使用 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}
于 2013-08-03T14:14:46.880 回答
0

用于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
于 2013-08-03T14:10:34.107 回答
0

最短(和最快)的方式可能是这样的:

features_agit_sum = dict([(k, sum(dict_features[k].values())) for k, v in dict_features.iteritems()])
于 2013-08-03T14:10:56.063 回答