在字典列表中使用“reduce”

2024-10-01 22:27:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试编写一个简单的Python函数,该函数将键为的所有值求和为。我正在为这项任务做函数式编程。因此,我需要使用列表理解mapfilter或{}。在这种情况下,我认为减少是一个合理的选择。在

def sum_favorites(msgs):
     num_favorites = reduce(lambda x, y: x["likes"] + y["likes"], msgs)
     return num_favorites


content1 = {"likes": 32, ...}
content2 = {"likes": 8, ...}
content3 = {"likes": 16, ...}
contents = [content1, content2, content3]
print(sum_favorites(contents)) 

当我实际运行代码时,问题就出现了。我似乎收到了这样的信息:TypeError:'int'对象不可订阅。对我来说,这个错误没有意义。如果reduce确实在迭代给定的参数,那么传递到lambda函数中的每个项都应该是一个字典,而且每个项中肯定都有一个likes键。问题是什么?这个Python错误到底意味着什么?在


Tags: lambda函数reduce编程错误contentsnumsum
3条回答

To me, this error makes no sense. If reduce is truly iterating through the given parameter, then each item passed into the lambda-function should be a dictionary

不,传递给lambda的first参数(对于除第一个调用之外的所有调用)是上一次调用lambda的返回值。您的函数返回一个数字,因此调用它时,x是一个数字,而不是字典。在

有两种方法可以解决这个问题。可能更直接的一点是:

num_favorites = reduce(lambda x, y: x + y['likes'], msgs, 0)

0是要reduce的“初始值设定项”参数,它为x提供第一个值。现在在每个调用中,x是正在运行的和,y是下一个字典。在

另一种方式,只是为了证明这是可以做到的,那就是:

^{pr2}$

这使得lambda的返回值是一个带有likes键的dict,就像它的参数一样,因此我们一直使用同一类型。在这种情况下,这是不必要的和浪费的,但如果您聚合了多个密钥,这可能是一个有趣的方法。在

根据reduce的具体实现方式,在reduce的第二次迭代中,传递给lambda的一个操作数将不是dict,而是到目前为止计算的总和。这给了你所看到的错误。在

为了避免这种情况,您可以首先进行列表或生成器理解,从各种dict中提取“likes”处的所有值,然后减少这些dict上的operator.add。或者只使用sum。在

在代码片段reduce(lambda x, y: x["likes"] + y["likes"], msgs)中,x变量首先是list msgs(dict)的第一个元素,但在第二次迭代时,它将是"likes"int)的和。在

因此,要求likes的总和,请使用reduce函数docinitializer参数。在

def sum_favorites(msgs):
    num_favorites = reduce(lambda x, y: x + y["likes"], msgs, 0)
    return num_favorites

但我相信,使用sum是一种更像Python的方式:

^{pr2}$

相关问题 更多 >

    热门问题