Python dict中的聚合项

Python dict中的聚合项,python,Python,我有这样一份清单: A = [{u'CI': {u'RP': 1}}, {u'CI': {u'RP': 1}}, {u'JI': {u'RP': 1}}] 我想要合并相同的键和dict中的增量值 例如: 根据这些值: {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}] 使用dict的方法: A = [{

我有这样一份清单:

A = [{u'CI': {u'RP': 1}}, {u'CI': {u'RP': 1}},  {u'JI': {u'RP': 1}}]
我想要合并相同的键和dict中的增量值

例如:

根据这些值:

{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}]
使用dict的方法:

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}}
你可以在这里用a来帮忙。这是一个
dict
,它将为缺少的键创建默认值。首先,您需要一个默认值为
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}))]

虽然我打赌有一个更聪明的方法来解决这个问题,但这种丑陋的混乱会解决这个问题

如果这很重要的话,它也可以在Python2中使用

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
{u'CI':{u'RP':2},u'JI':{u'RP':1}


我使用的一般策略如下,您应该 将B.initialize()和B.update()替换为所需的内容 在您的具体问题中:

B = {}
for i in A: 
    if i not in B: 
        B.initialize(i)
    B.update(i,A[i])
让我写一个简单的例子:

B = {}
for i in A: 
    if i not in B: 
        B[i] = 0
    B[i] += A[i] 
您的任务应该是为您的问题编写它,我不能,因为我不知道如果存在元素{u'CI':{u'RB':1,u'RP':1},您要编写的代码应该如何运行

B = {}
for i in A: 
    if i not in B: 
        B[i] = 0
    B[i] += A[i]