我有一个字典列表,如下所示:
a=[{'a':1},{'b':2},{'c':3},{'a':-2},{'b':4}]
我需要遍历列表并添加键匹配的值。结果应如下所示:
a=[{'a':-1},{'b':6},{'c':3}]
对此的帮助表示赞赏。
我有一个字典列表,如下所示:
a=[{'a':1},{'b':2},{'c':3},{'a':-2},{'b':4}]
我需要遍历列表并添加键匹配的值。结果应如下所示:
a=[{'a':-1},{'b':6},{'c':3}]
对此的帮助表示赞赏。
我能够用类似的东西来实现它
a = [{'a':1},{'b':2},{'c':3},{'a':-2},{'b':4}]
b = {}
for x in a:
k,v = x.popitem()
# Check if the key is already in our output dict
if k in b.keys():
b[k] += v
# If not, create it
else:
b[k] = v
哪个输出
b = {'a': -1, 'b': 6, 'c': 3}
你可以使用collections.Counter
:
from collections import Counter
a=[{'a':1},{'b':2},{'c':3},{'a': 4},{'b':4}]
result = sum((Counter(x) for x in a),Counter())
这导致:
Counter({'b': 6, 'a': 5, 'c': 3})
但是,要使用负数,您必须使用循环:
c = Counter()
a=[{'a':1},{'b':2},{'c':3},{'a':-2},{'b':4}]
for x in a:
c.update(x)
导致:
Counter({'b': 6, 'c': 3, 'a': -1})
这些方法使用一个Counter
(类似于 multiset/bag),我认为它是一个比 1 元素字典列表更有用的数据结构,但如果你真的想要的话,应该很容易转换为你的数据结构。 .
[{k:v} for k,v in result.items()]
如果订单很重要或其他东西,可能会排序result.items()
......
国际大学联盟:
from collections import defaultdict
def dicts_combine(dcts):
cd = defaultdict(int)
for subdict in dcts:
for k,v in subdict.items():
cd[k] += v
dsplit = [{k: v} for k,v in sorted(cd.items())]
return dsplit
应该给出你想要的输出:
>>> a = [{'a':1},{'b':2},{'c':3},{'a':-2},{'b':4}]
>>> dicts_combine(a)
[{'a': -1}, {'b': 6}, {'c': 3}]
您可以随意删除sorted
。