在dict中聚合项目

时间:2011-12-09 08:50:59

标签: 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}]

4 个答案:

答案 0 :(得分:7)

您可以在此处使用defaultdict from collections来提供帮助。这是dict,它将为缺失的密钥创建默认值。首先,您需要一个默认值为defaultdict的{​​{1}}来进行聚合。接下来,您需要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}))]

defaultdict

答案 1 :(得分:1)

使用dict的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}}

答案 2 :(得分: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
  

{u'CI':{u'RP':2},u'JI':{u'RP':1}}

答案 3 :(得分:0)

我使用的一般策略如下,你应该在哪里 用你想要的东西替换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,你' RP':1}}存在。