在dict中聚合项目

use*_*362 5 python

我有一个这样的列表:

A = [{u'CI': {u'RP': 1}}, {u'CI': {u'RP': 1}},  {u'JI': {u'RP': 1}}]
Run Code Online (Sandbox Code Playgroud)

我想在dict中合并相同的键和增量值.

例:

从这些值:

{u'CI': {u'RP': 1}}, {u'CI': {u'RP': 1}}
Run Code Online (Sandbox Code Playgroud)

我会有:

{u'CI': {u'RP': 2}}
Run Code Online (Sandbox Code Playgroud)

最终列表结果是:

A = [{u'CI': {u'RP': 2}}, {u'JI': {u'RP': 1}]
Run Code Online (Sandbox Code Playgroud)

Dav*_*ebb 7

你可以在这里使用defaultdictfromcollections来提供帮助.这dict将创建缺失键的默认值.首先,您需要一个defaultdict具有默认值的0聚合.接下来你需要一个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}))]
Run Code Online (Sandbox Code Playgroud)

如果你真的想要一个单键dicts列表而不是一个带有不同键的单个dict,你可以转换defaultdict如下:

>>> [{key: dict(value)} for key,value in B.iteritems()]
[{u'CI': {u'RP': 2}}, {u'JI': {u'RP': 1}}]
Run Code Online (Sandbox Code Playgroud)