python中sum字典_Python:优雅地将字典与值的sum()合并

不会比这更简单,我想:a=[("13.5",100)]

b=[("14.5",100), ("15.5", 100)]

c=[("15.5",100), ("16.5", 100)]

input=[a,b,c]

from collections import Counter

print sum(

(Counter(dict(x)) for x in input),

Counter())

请注意,Counter(也称为multiset)是数据的最自然的数据结构(一种类型的集合,元素可以属于该集合不止一次,或者等价于一个具有语义元素-gt;OccurrenceCount的映射)。你本来可以用它来代替元组列表的。

也可能:from collections import Counter

from operator import add

print reduce(add, (Counter(dict(x)) for x in input))

使用reduce(add, seq)而不是sum(seq, initialValue)通常更灵活,允许跳过传递多余的初始值。

注意,您还可以使用operator.and_来查找多集的交集,而不是求和。

上面的变体非常慢,因为每一步都会创建一个新的计数器。我们来解决这个问题。

我们知道Counter+Counter返回一个包含合并数据的新Counter。这是可以的,但我们想避免额外的创造。我们改用Counter.update:update(self, iterable=None, **kwds) unbound collections.Counter method

Like dict.update() but add counts instead of replacing them.

Source can be an iterable, a dictionary, or another Counter instance.

这就是我们想要的。让我们用一个与reduce兼容的函数包装它,看看会发生什么。def updateInPlace(a,b):

a.update(b)

return a

print reduce(updateInPlace, (Counter(dict(x)) for x in input))

这只比OP的解决方案慢一点。

基准:http://ideone.com/7IzSx(使用另一个解决方案进行更新,这要感谢astymax)

(还有:如果你非常想要一个一行程序,你可以用lambda x,y: x.update(y) or x来替换updateInPlace,它的工作方式是相同的,甚至比原来快了一瞬间,但是在可读性上失败了。不要:-)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值