如何总结字典元素

时间:2010-08-16 05:12:13

标签: python dictionary sum

在Python中, 我有一些词典:

dict1 = [{'a':2, 'b':3},{'a':3, 'b':4}]

我想要一个包含所有词汇总和的最终词典。 结果将是:{'a':5, 'b':7}

N.B:列表中的每个字典都包含相同数量的键值对。

11 个答案:

答案 0 :(得分:44)

您可以使用collections.Counter

counter = collections.Counter()
for d in dict1: 
    counter.update(d)

或者,如果您更喜欢oneliners:

functools.reduce(operator.add, map(collections.Counter, dict1))

答案 1 :(得分:15)

有点难看,但是单行:

dictf = reduce(lambda x, y: dict((k, v + y[k]) for k, v in x.iteritems()), dict1)

答案 2 :(得分:11)

在添加多个词组时,利用sum()可以获得更好的性能

>>> dict1 = [{'a':2, 'b':3},{'a':3, 'b':4}]
>>> from operator import itemgetter
>>> {k:sum(map(itemgetter(k), dict1)) for k in dict1[0]}        # Python2.7+
{'a': 5, 'b': 7}
>>> dict((k,sum(map(itemgetter(k), dict1))) for k in dict1[0])  # Python2.6
{'a': 5, 'b': 7}

添加斯蒂芬的建议

>>> {k: sum(d[k] for d in dict1) for k in dict1[0]}            # Python2.7+
{'a': 5, 'b': 7}
>>> dict((k, sum(d[k] for d in dict1)) for k in dict1[0])      # Python2.6
{'a': 5, 'b': 7}

我认为Stephan的Python2.7代码版本读得非常好

答案 3 :(得分:8)

这可能会有所帮助:

def sum_dict(d1, d2):
    for key, value in d1.items():
        d1[key] = value + d2.get(key, 0)
    return d1

>>> dict1 = [{'a':2, 'b':3},{'a':3, 'b':4}]
>>> reduce(sum_dict, dict1)
{'a': 5, 'b': 7}

答案 4 :(得分:5)

以下代码显示了一种方法:

dict1 = [{'a':2, 'b':3},{'a':3, 'b':4}]

final = {}
for k in dict1[0].keys():           # Init all elements to zero.
    final[k] = 0
for d in dict1:
    for k in d.keys():
        final[k] = final[k] + d[k]  # Update the element.

print final

输出:

{'a': 5, 'b': 7}

如你所愿。

或者,受到kriss的启发,更好但仍然可读:

dict1 = [{'a':2, 'b':3},{'a':3, 'b':4}]

final = {}
for d in dict1:
    for k in d.keys():
        final[k] = final.get(k,0) + d[k]

print final

我喜欢原始的,可读的Python的日子: - )

答案 5 :(得分:4)

我对拟议的Counter,reduce和sum方法对大型列表的性能感兴趣。也许其他人也对此感兴趣。 您可以在这里查看:https://gist.github.com/torstenrudolf/277e98df296f23ff921c

我测试了这个词典列表的三种方法:

dictList = [{'a': x, 'b': 2*x, 'c': x**2} for x in xrange(10000)]
sum方法表现出最佳性能,其次是reduce和Counter是最慢的。下面显示的时间是几秒钟。

In [34]: test(dictList)
Out[34]: 
{'counter': 0.01955194902420044,
 'reduce': 0.006518083095550537,
 'sum': 0.0018319153785705566}

但这取决于词典中的元素数量。 sum方法的减速速度比减速速度快。

l = [{y: x*y for y in xrange(100)} for x in xrange(10000)]

In [37]: test(l, num=100)
Out[37]: 
{'counter': 0.2401433277130127,
 'reduce': 0.11110662937164306,
 'sum': 0.2256883692741394}

答案 6 :(得分:2)

这是一个合理的美丽。

public function prueba(){
  echo $this->load->view('datos_persona',true);
}

答案 7 :(得分:1)

在Python 2.7中,您可以用collections.Counter对象替换dict。这支持计数器的加法和减法。

答案 8 :(得分:1)

这是另一个可行的解决方案(python3),因为它适用于dict,list和array,因此非常通用。对于非常见元素,原始值将包含在输出字典中。

def mergsum(a, b):
    for k in b:
        if k in a:
            b[k] = b[k] + a[k]
    c = {**a, **b}
    return c

dict1 = [{'a':2, 'b':3},{'a':3, 'b':4}]
print(mergsum(dict1[0], dict1[1]))

答案 9 :(得分:0)

另一个单行解决方案

dict(
    functools.reduce(
        lambda x, y: x.update(y) or x,  # update, returns None, and we need to chain.
        dict1,
        collections.Counter())
)

这只创建一个计数器,将其用作累加器,最后转换回dict。

答案 10 :(得分:0)

您还可以使用 pandas sum 函数来计算总和:

import pandas as pd
# create a DataFrame
df = pd.DataFrame(dict1)
# compute the sum and convert to dict.
dict(df.sum())

结果:

{'a': 5, 'b': 7}

它也适用于浮点:

dict2 = [{'a':2, 'b':3.3},{'a':3, 'b':4.5}]
dict(pd.DataFrame(dict2).sum())

给出正确的结果:

{'a': 5.0, 'b': 7.8}