Naz*_*san 36 python dictionary sum
在Python中,我有一个dicts列表:
dict1 = [{'a':2, 'b':3},{'a':3, 'b':4}]
Run Code Online (Sandbox Code Playgroud)
我想要一个最终的dict,它将包含所有dicts的总和.即结果将是:{'a':5, 'b':7}
注意:列表中的每个字典都包含相同数量的键值对.
Sig*_*gyF 45
您可以使用collections.Counter
counter = collections.Counter()
for d in dict1:
counter.update(d)
Run Code Online (Sandbox Code Playgroud)
或者,如果您更喜欢oneliners:
functools.reduce(operator.add, map(collections.Counter, dict1))
Run Code Online (Sandbox Code Playgroud)
car*_*arl 16
有点难看,但是单行:
dictf = reduce(lambda x, y: dict((k, v + y[k]) for k, v in x.iteritems()), dict1)
Run Code Online (Sandbox Code Playgroud)
Joh*_*ooy 11
sum()添加多个dicts时,利用应该会获得更好的性能
>>> 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}
Run Code Online (Sandbox Code Playgroud)
加入斯蒂芬的建议
>>> {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}
Run Code Online (Sandbox Code Playgroud)
我认为Stephan的Python2.7代码版本读得非常好
这可能有所帮助:
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}
Run Code Online (Sandbox Code Playgroud)
以下代码显示了一种方法:
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
Run Code Online (Sandbox Code Playgroud)
这输出:
{'a': 5, 'b': 7}
Run Code Online (Sandbox Code Playgroud)
如你所愿.
或者,受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
Run Code Online (Sandbox Code Playgroud)
我松了原始的,可读的Python的日子:-)
我对针对大型列表的建议 Counter、reduce 和 sum 方法的性能感兴趣。也许其他人也对此感兴趣。你可以看看这里:https : //gist.github.com/torstenrudolf/277e98df296f23ff921c
我为此字典列表测试了三种方法:
dictList = [{'a': x, 'b': 2*x, 'c': x**2} for x in xrange(10000)]
Run Code Online (Sandbox Code Playgroud)
sum 方法表现出最好的性能,其次是reduce,而Counter 是最慢的。下面显示的时间以秒为单位。
In [34]: test(dictList)
Out[34]:
{'counter': 0.01955194902420044,
'reduce': 0.006518083095550537,
'sum': 0.0018319153785705566}
Run Code Online (Sandbox Code Playgroud)
但这取决于字典中的元素数量。sum 方法比reduce 慢得更快。
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}
Run Code Online (Sandbox Code Playgroud)
您还可以使用 pandas sum函数来计算总和:
import pandas as pd
# create a DataFrame
df = pd.DataFrame(dict1)
# compute the sum and convert to dict.
dict(df.sum())
Run Code Online (Sandbox Code Playgroud)
这导致:
{'a': 5, 'b': 7}
Run Code Online (Sandbox Code Playgroud)
它也适用于浮点:
dict2 = [{'a':2, 'b':3.3},{'a':3, 'b':4.5}]
dict(pd.DataFrame(dict2).sum())
Run Code Online (Sandbox Code Playgroud)
给出正确的结果:
{'a': 5.0, 'b': 7.8}
Run Code Online (Sandbox Code Playgroud)