如何将嵌套字典列表与它们的值中的公共键相加? [复制]
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() 来执行此操作,但到目前为止我所拥有的不起作用。它只返回每个元素的 a
或 b
的最后一个值:
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 keys
和reduce(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
【讨论】:
以上是关于如何将嵌套字典列表与它们的值中的公共键相加? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何比较字典值中的多个数组,并将每个数组元素的字典键映射到新数组/列表中