当前位置: 首页 > 知识库问答 >
问题:

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

丌官和泰
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}

不出所料。

我正要发疯,因为一个同事看到了代码。她坚持认为,必须有一种更加Pythonic和优雅的方式来完成它,而不需要这些嵌套的for循环。有什么想法吗?

共有1个答案

管梓
2023-03-14

我想没有比这更简单的了:

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)是数据最自然的数据结构(一种元素可以不止一次或等价地属于它的集合类型--带有语义元素的映射->curpenceCount。

也可能:

from collections import Counter
from operator import add

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

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

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

我们知道counter+counter返回一个包含合并数据的新的counter。这是可以的,但我们希望避免额外的创造。让我们改用counter.update:

更新(self,iterable=none,**kwds)未绑定的Collections.Counter方法

类似于dict.update(),但是添加计数而不是替换它们。源可以是可迭代、字典或其他计数器实例。

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

def updateInPlace(a,b):
    a.update(b)
    return a

print reduce(updateInPlace, (Counter(dict(x)) for x in input))
 类似资料:
  • 问题内容: 我正在尝试合并来自多个服务器的日志。每个日志都是一个元组列表(,)。可能会出现多次,并且我希望结果字典能够保存所有服务器的所有计数之和。 这是我的尝试,例如一些数据: 这使: 如预期的那样。 我要去吃香蕉,因为有一位同事看到了密码。 她坚持认为,必须有一种更加Python化和优雅的方法来做到这一点,而这些方法不能嵌套在循环中。有任何想法吗? 问题答案: 我认为没有比这更简单的了: 请注

  • 本文向大家介绍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中包含任何其他类型,则确实存在错误。