栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Python:用值的sum()优雅地合并字典[重复]

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 Counterprint sum(    (Counter(dict(x)) for x in input),    Counter())

请注意,

Counter
(也称为多集)是数据的最自然的数据结构(一种元素可以不止一次属于的集合类型,或者等效地-语义为Element->OccurrenceCount的映射。排名第一,而不是元组列表。


也可能:

from collections import Counterfrom operator import addprint 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)未绑定collections.Counter方法

像dict.update()一样,但是添加计数而不是替换它们。源可以是可迭代的,字典或其他Counter实例。

那就是我们想要的。让我们用兼容的函数包装它,

reduce
看看会发生什么。

def updateInPlace(a,b):    a.update(b)    return aprint reduce(updateInPlace, (Counter(dict(x)) for x in input))

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

基准 :http : _**//ideone.com/7IzSx (由于使用了

astynax** ,因此更新了另一个解决方案)_

(另外:如果你拼命想要的一行代码,您可以替换

updateInPlace
通过
lambda x,y: x.update(y) orx
其工作方式相同,甚至被证明是一个分裂的第二快,但是在可读性失败时不:-))。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/637731.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号