字典值的总和列表

新手上路,请多包涵

我有一个这种形式的字典列表:

 [
{'signal_8': 1, 'signal_1': 7, 'signal_10': 5, 'signal_5': 2, 'signal_2': 5, 'signal_6': 3, 'signal_4': 9, 'signal_3': 6, 'signal_9': 4, 'signal_7': 8},

{'signal_8': 1, 'signal_1': 7, 'signal_10': 5, 'signal_5': 2, 'signal_2': 5, 'signal_6': 3, 'signal_4': 9, 'signal_3': 6, 'signal_9': 4, 'signal_7': 8},

{'signal_8': 1, 'signal_1': 7, 'signal_10': 5, 'signal_5': 2, 'signal_2': 5, 'signal_6': 3, 'signal_4': 9, 'signal_3': 6, 'signal_9': 4, 'signal_7': 8},
]

我想像这样为列表中的每个元素按键总结其中的值:

     {
     'signal_8': 3,
     'signal_1': 21,
     'signal_10': 15,
     'signal_5': 6,
     'signal_2': 15,
     'signal_6': 9,
     'signal_4': 27,
     'signal_3': 18,
     'signal_9': 12,
     'signal_7': 24
    }

我尝试过的是以下内容:

     result = {}
    sm = 0
    for elm in original_list:
        for k,v in elm.items():
            sm += v
            result[k] = sm
    print(result)

但它仍然不起作用。

原文由 saul 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 566
2 个回答

你想要的是 Counter 集合类型。关于 集合 的 Python 文档对其进行了最好的描述,但本质上 Counter 是一种特殊类型的字典,其中所有值都是整数。您可以传递任何密钥,包括不存在的密钥,并添加到它们中。例如:

 from collections import Counter

original_list = [
    {'signal_8': 1, 'signal_1': 7, 'signal_10': 5, 'signal_5': 2, 'signal_2': 5, 'signal_6': 3, 'signal_4': 9, 'signal_3': 6, 'signal_9': 4, 'signal_7': 8},
    {'signal_8': 1, 'signal_1': 7, 'signal_10': 5, 'signal_5': 2, 'signal_2': 5, 'signal_6': 3, 'signal_4': 9, 'signal_3': 6, 'signal_9': 4, 'signal_7': 8},
    {'signal_8': 1, 'signal_1': 7, 'signal_10': 5, 'signal_5': 2, 'signal_2': 5, 'signal_6': 3, 'signal_4': 9, 'signal_3': 6, 'signal_9': 4, 'signal_7': 8},
]

result = Counter()

for elem in original_list:
    for key, value in elem.items():
        result[key] += value

print(result)

编辑:@timgeb 提供了此答案的变体,它在 Counter 对象上本地使用 update() 方法。我建议将其作为最佳答案

原文由 daveruinseverything 发布,翻译遵循 CC BY-SA 4.0 许可协议

类似于 daveruinseverything 的回答,我会用 Counter 解决这个问题,但要使用它的 update 方法。

signals 成为你的字典列表。

 >>> from collections import Counter
>>> c = Counter()
>>> for d in signals:
...     c.update(d)
...
>>> c
Counter({'signal_4': 27, 'signal_7': 24, 'signal_1': 21, 'signal_3': 18, 'signal_10': 15, 'signal_2': 15, 'signal_9': 12, 'signal_6': 9, 'signal_5': 6, 'signal_8': 3})

看在 Op 的份上,你能简要描述一下这里发生的事情吗?

Counter 的工作方式类似于 dict ,但其 update 方法将值添加到值而不是覆盖预先存在的键。

原文由 timgeb 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题