当前位置: 首页 > 面试题库 >

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

楚鸿波
2023-03-14
问题内容

我正在尝试合并来自多个服务器的日志。每个日志都是一个元组列表(datecount)。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中包含任何其他类型,则确实存在错误。