如何将嵌套字典列表与它们的值中的公共键相加? [复制]

Posted

技术标签:

【中文标题】如何将嵌套字典列表与它们的值中的公共键相加? [复制]【英文标题】:How to sum list of nested dicts with common keys in their values? [duplicate] 【发布时间】:2018-09-30 15:13:28 【问题描述】:

如何获取这样的字典列表:

ps = ['one': 'a': 30,
               "b": 30,
       'two': 'a': -1000,
      'three': 'a': 44, 'one': 'a': -225,
      'one': 'a': 2000,
               "b": 30]

并产生这样的字典:

"one": "a": 1805, "b": 60, "two": "a": -1000, "three": "a": 44

我很确定我可以使用 collections.Counter() 来执行此操作,但到目前为止我所拥有的不起作用。它只返回每个元素的 ab 的最后一个值:

res = Counter(ps[0])
for t in ps[1:]:
    for key, vals in t.items():
        res.update(vals)
        if key not in res.keys():
            res[key] = vals
        else:
            res[key].update(vals)

# Wrong!
res
Counter('one': 'a': 2000, 'b': 30, 'two': 'a': -1000, 'a': 1819, 'b': 30)

我是 python 新手,所以请原谅我确定是丑陋的代码。

【问题讨论】:

我不确定这是不是重复的。需要考虑额外的嵌套级别。我使用defaultdict 解决了这个问题:res = defaultdict(Counter); for d in ps: for k, v in d.items(): d[k].update(v) 你可以做def red(x,y): ... keys = set(x).union(set(y)) ... return k: j: x.get(k, ).get(j,0) + y.get(k, ).get(j,0) for j in (x.get(k,).keys()+y.get(k,).keys()) for k in keysreduce(red, ps) 【参考方案1】:
res = 
for t in ps: 
    for key, vals in t.items():
        if key not in res:
            res[key] = vals
        else:
            for innerKey, innerVal in vals.items():
                if innerKey not in res[key]:
                    res[key][innerKey] = 0 
                res[key][innerKey] += innerVal

而res是

'three': 'a': 44, 'two': 'a': -1000, 'one': 'a': 1805, 'b': 60

【讨论】:

以上是关于如何将嵌套字典列表与它们的值中的公共键相加? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何比较字典值中的多个数组,并将每个数组元素的字典键映射到新数组/列表中

嵌套字典。合并公共键并将值附加到列表中。 0 值未附加。里面的代码

按数组中的多个属性对对象进行分组,然后将它们的值相加

Python中的字典

包含重复项的嵌套字典中的求和值

Django模板访问嵌套数据