字典中聚合项
我有一个这样的列表:
A = [{u'CI': {u'RP': 1}}, {u'CI': {u'RP': 1}}, {u'JI': {u'RP': 1}}]
我想把相同的键合并起来,并把它们的值加起来。
举个例子:
从这些值:
{u'CI': {u'RP': 1}}, {u'CI': {u'RP': 1}}
我会得到:
{u'CI': {u'RP': 2}}
最终的列表结果是:
A = [{u'CI': {u'RP': 2}}, {u'JI': {u'RP': 1}]
4 个回答
0
虽然这个方法看起来很糟糕,但我敢打赌还有更聪明的办法可以做到这一点。
如果你在用Python 2,这个方法也能用,假如这对你来说很重要的话。
A = [{u'CI': {u'RP': 1}}, {u'CI': {u'RP': 1}}, {u'JI': {u'RP': 1}}]
B = {}
for item in A:
key = item.keys()[0]
subDict = item.values()[0]
existingSubDict = B[key] if key in B else {}
for subKey, value in subDict.iteritems():
if not subKey in existingSubDict:
existingSubDict[subKey] = 0
existingSubDict[subKey] += value
B[key] = existingSubDict
print B
1
使用字典的 setdefault
方法:
A = [{u'CI': {u'RP': 1}}, {u'CI': {u'RP': 1}}, {u'JI': {u'RP': 1}}]
B = {}
for i in A:
k = i.keys()[0] # k is 'CI' or 'JI' in this case
B.setdefault(k, {u'RP': 0}) # set the default 'RP' to 0
B[k]['RP'] += i[k][u'RP'] # add the RP. Because we already
# set the default to 0 this will not blow up
print B
# {u'CI': {u'RP': 2}, u'JI': {u'RP': 1}}
7
你可以使用来自 collections
的 defaultdict
来解决这个问题。这个 defaultdict
是一种字典,它会为缺失的键自动创建默认值。首先,你需要一个默认值为 0
的 defaultdict
来进行数据汇总。接下来,你还需要一个 defaultdict
,它的默认值是第一个类型的 defaultdict
,这样你就可以构建出两层的数据结构。
>>> A = [{u'CI': {u'RP': 1}}, {u'CI': {u'RP': 1}}, {u'JI': {u'RP': 1}}]
>>> B = defaultdict(lambda: defaultdict(int))
>>> for d in A:
... for (key,d2) in d.iteritems():
... for (key2, value) in d2.iteritems():
... B[key][key2] += value
...
>>> B.items()
[(u'CI', defaultdict(<type 'int'>, {u'RP': 2})), (u'JI', defaultdict(<type 'int'>, {u'RP': 1}))]
如果你真的想要一个包含单个键字典的列表,而不是一个包含不同键的单个字典,你可以按照下面的方式转换这个 defaultdict
:
>>> [{key: dict(value)} for key,value in B.iteritems()]
[{u'CI': {u'RP': 2}}, {u'JI': {u'RP': 1}}]