你想在这里使用一个列表,你想要使用Counter()对象来使得求和更容易:
from collections import Counter
from itertools import izip_longest
for dcts in data.values():
for i,dct in enumerate(dcts):
if i >= len(result):
result.append(Counter(dct))
else:
result[i].update(dct)
结果:
>>> result
[Counter({'a': 10,'b': 7}),Counter({'b': 18,'a': 11}),Counter({'a': 12,'b': 5}),Counter({'b': 11,'a': 5}),Counter({'b': 9,'a': 4}),Counter({'a': 3,'b': 2}),Counter({'a': 1,'b': 0})]
Counter()对象是dict的子类,因此它们表现为字典.如果之后必须有dict值,请添加以下行:
result = [dict(r) for r in result]
从Eric那里获取灵感,您可以将上述内容转化为单行:
from collections import Counter
from itertools import izip_longest
result = [sum(map(Counter,col),Counter())
for col in izip_longest(*data.values(),fillvalue={})]
这个版本与上面的循环略有不同,因为在求和时从计数器中删除了0的键.如果你想在最后一个计数器中保持’b’:0,请使用:
[reduce(lambda c,d: c.update(d) or c,col,Counter())
for col in izip_longest(*data.values(),fillvalue={})]
这再次使用.update().