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

Kos..

33

我认为不会比这更简单:

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(也称为多集)是数据最自然的数据结构(元素可以多次出现的集合类型,或者等效地 - 具有语义元素的映射 - > 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带有合并数据的新内容.这没关系,但我们希望避免额外的创建.让我们Counter.update改用:

update(self,iterable = None,**kwds)unbound collections.Counter方法

与dict.update()类似,但添加计数而不是替换它们.Source可以是可迭代的,字典或其他Counter实例.

这就是我们想要的.让我们用兼容的函数包装它,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(更新了另一个解决方案,感谢astynax)

(另外:如果你拼命想要的一行代码,您可以替换updateInPlace通过lambda x,y: x.update(y) or x其工作方式相同,甚至被证明是一个分裂的第二快,但是在可读性失败时不:-)).

+1我真的很喜欢这个解决方案. (2认同)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值