【问题标题】:Python reduce in list of dictionariesPython减少字典列表
【发布时间】:2021-03-03 09:48:40
【问题描述】:

我是一名 Java 开发人员;但是,偶尔由于 Java 的 aws lambda 冷启动,我决定将 python 用于简单的 lambda,因为它不需要编译,消除了冷启动。

问题: 我有一个字典列表,我从 Dynamo 中检索到这个,简而言之,一个有效的示例如下

[
   {
    "data":"data",
    "Count": 60
   },
   {
    "data":"data",
    "Count": 60
   }
]

我正在尝试减少,通过执行以下操作来获取 Count 字段的总和;但是,我不明白我错过了什么。

reduce(lambda x, y: int(x['Count']) +
                  int(y['Count']), query_response)

"errorMessage": "'int' object is not iterable" 失败

这样做的正确方法是什么?

提前致谢。

【问题讨论】:

  • 我刚刚发布了一个答案,但后来发现我无法重现该问题。这个错误听起来像是 query_response 实际上是一个 int,而不是一个列表。

标签: python python-3.x reduce functools


【解决方案1】:

你需要给x一个初始值0:

>>> from functools import reduce
>>> query_reponse = [
...    {
...     "data": "data",
...     "Count": 60
...    },
...    {
...     "data": "data",
...     "Count": 60
...    }
... ]
>>> reduce(lambda x, y: x + y["Count"], query_reponse, 0)
120

理想情况下,您会希望使用更具描述性的变量名称,例如:

>>> reduce(lambda total, d: total + d["Count"], query_reponse, 0)
120

有关更多信息,请查看functools.<b>reduce</b> 的文档

正如另一个答案所暗示的那样,您可能希望将sum() 用于这样的小任务。但是,我仍然认为了解 reduce 的工作原理很重要,因为它在 PySpark/Spark 或其他语言中很流行。

【讨论】:

  • 这对我来说是一个超级简单的错过......非常感谢!
  • 不用担心,大多数人只在您的初始方法有效的列表上使用 reduce,他们对它的幕后工作原理感到困惑。
【解决方案2】:

要获得总和,请使用sum,而不是reduce

>>> query_response = [{'data': 'data', 'Count': 60}, {'data': 'data', 'Count': 60}]
>>> sum(x['Count'] for x in query_response)
120

这也使用generator expression

【讨论】:

    猜你喜欢
    • 2014-05-16
    • 2017-07-16
    • 2014-06-11
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 2021-12-30
    • 2020-04-03
    • 1970-01-01
    相关资源
    最近更新 更多