字典中聚合项

5 投票
4 回答
4118 浏览
提问于 2025-04-17 08:02

我有一个这样的列表:

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

你可以使用来自 collectionsdefaultdict 来解决这个问题。这个 defaultdict 是一种字典,它会为缺失的键自动创建默认值。首先,你需要一个默认值为 0defaultdict 来进行数据汇总。接下来,你还需要一个 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}}]

撰写回答