我正在尝试合并来自多个服务器的日志。每个日志都是一个元组列表(date
,count
)。date
可能会出现多次,并且我希望结果字典能够保存所有服务器的所有计数之和。
这是我的尝试,例如一些数据:
from collections import defaultdict
a=[("13.5",100)]
b=[("14.5",100), ("15.5", 100)]
c=[("15.5",100), ("16.5", 100)]
input=[a,b,c]
output=defaultdict(int)
for d in input:
for item in d:
output[item[0]]+=item[1]
print dict(output)
这使:
{'14.5': 100, '16.5': 100, '13.5': 100, '15.5': 200}
如预期的那样。
我要去吃香蕉,因为有一位同事看到了密码。
她坚持认为,必须有一种更加Python化和优雅的方法来做到这一点,而这些方法不能嵌套在循环中。有任何想法吗?
我认为没有比这更简单的了:
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
(也称为多集)是数据的最自然的数据结构(一种元素可以不止一次属于的集合类型,或者等效地-语义为Element->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)未绑定collections.Counter方法
像dict.update()一样,但是添加计数而不是替换它们。源可以是可迭代的,字典或其他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
其工作方式相同,甚至被证明是一个分裂的第二快,但是在可读性失败时不:-))。
我正在尝试合并来自几个服务器的日志。每个日志都是元组列表(、)。可能出现多次,我希望得到的字典保存来自所有服务器的所有计数的总和。 下面是我的尝试,有一些数据,例如: 它给出: 不出所料。 我正要发疯,因为一个同事看到了代码。她坚持认为,必须有一种更加Pythonic和优雅的方式来完成它,而不需要这些嵌套的for循环。有什么想法吗?
本文向大家介绍Python合并字典,包括了Python合并字典的使用技巧和注意事项,需要的朋友参考一下 示例 考虑以下字典: Python 3.5+ 如本示例所示,重复的键映射到它们的最后一个值(例如,“ Clifford”覆盖“ Nemo”)。 Python 3.3以上 使用此技术,给定键的最前值优先,而不是最后一个(“ Clifford”被抛弃,取而代之的是“ Nemo”)。 Python 2
问题内容: 我正在尝试合并三个具有相同键,值列表或单个值的字典。 我需要将值中的所有项目添加到一个列表中。 我尝试了几种方法,但是大多数方法将值放入嵌套列表中。例如 我尝试通过遍历值来更新它: 但结果完全一样。我试图简单地添加列表,但是由于第三个字典只有一个浮点数,所以我做不到。 因此,我尝试首先以1和2的值添加列表,然后附加3的值。添加列表效果很好,但是当我尝试从第三个字典中添加浮点数时,突然整
问题内容: 我需要合并多个词典,例如: 随着A B C和D作为树的叶子像 词典的级别(深度)未知,可能是 在我的情况下,它代表目录/文件结构,其中节点为docs,而节点为文件。 我想将它们合并以获得: 我不确定如何使用Python轻松做到这一点。 问题答案: 这实际上是非常棘手的-特别是如果你希望在事物不一致时收到有用的错误消息,同时正确地接受重复但一致的条目(这里没有其他答案了……)。 假设你没
本文向大家介绍Python实现合并字典的方法,包括了Python实现合并字典的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python实现合并字典的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的Python程序设计有所帮助。
问题内容: Python中是否有一个可用于深度合并字典的库: 以下: 当我结合时,我希望它看起来像: 问题答案: 我希望我不会重新发明轮子,但是解决方案相当短。而且,超级有趣的代码。 因此,其想法是将源复制到目标,并且每次源中的命令都进行递归。因此,如果在A中给定元素包含字典而在B中包含任何其他类型,则确实存在错误。