我有一个嵌套词典
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] - 尝试访问更深层次的词典
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
TypeError:+:'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'对象不可订阅
答案 0 :(得分:3)
使用词典理解:
{key: sum(value.itervalues()) for key, value in dict_features.iteritems()}
如果您使用的是Python 3,请删除iter
前缀,因此请使用.values()
和.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}
答案 1 :(得分: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}
答案 2 :(得分: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
答案 3 :(得分:0)
最短(也是最快)的方式可能如下:
features_agit_sum = dict([(k, sum(dict_features[k].values())) for k, v in dict_features.iteritems()])