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]