我正在尝试编写一个简单的Python函数,该函数将键为的所有值求和为。我正在为这项任务做函数式编程。因此,我需要使用列表理解、map
、filter
或{
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错误到底意味着什么?在
不,传递给lambda的first参数(对于除第一个调用之外的所有调用)是上一次调用lambda的返回值。您的函数返回一个数字,因此调用它时,
x
是一个数字,而不是字典。在有两种方法可以解决这个问题。可能更直接的一点是:
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
函数doc的initializer
参数。在但我相信,使用
^{pr2}$sum
是一种更像Python的方式:相关问题 更多 >
编程相关推荐