添加键匹配的字典值

时间:2013-04-18 01:18:22

标签: python list dictionary

我有一个字典列表,如下所示:

a=[{'a':1},{'b':2},{'c':3},{'a':-2},{'b':4}]

我需要遍历列表并添加键匹配的值。结果应如下所示:

a=[{'a':-1},{'b':6},{'c':3}]

帮助这样做表示赞赏。

3 个答案:

答案 0 :(得分: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),我认为这是一个比单元素序列更有用的数据结构,但应该很容易转换为您的数据 - 结构如果你真的想......

[{k:v} for k,v in result.items()]

如果订单有问题,可能会对result.items()进行排序......

答案 1 :(得分:2)

我能用

之类的东西来实现它
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}

答案 2 :(得分:2)

IIUC:

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