加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 在词典列表中使用’reduce’

发布时间:2020-12-20 13:01:42 所属栏目:Python 来源:网络整理
导读:我正在尝试编写一个简单的 Python函数,它将具有键的所有值相加.我正在为这项任务进行函数式编程.因此,我需要使用list-comprehension,map,filter或reduce.在这种情况下,我认为reduce是一个合理的选择. def sum_favorites(msgs): num_favorites = reduce(lambd
我正在尝试编写一个简单的 Python函数,它将具有键的所有值相加.我正在为这项任务进行函数式编程.因此,我需要使用list-comprehension,map,filter或reduce.在这种情况下,我认为reduce是一个合理的选择.

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函数的每个项应该是一个字典 – 并且每个项肯定都有一个类似的键.问题是什么,这个Python错误究竟是什么意思?

解决方法

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的第一个参数(对于除第一个之外的所有调用)是前一次调用lambda的返回值.您的函数返回一个数字,因此将调用x为数字而不是字典.

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

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

0是reduce的“initializer”参数,它提供x的第一个值.现在在每个调用中,x是运行总和,y是下一个字典.

另一种方式,只是为了表明它可以做到,是:

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

这使得lambda的返回值成为带有like键的dict,就像它的参数一样,所以我们在整个过程中使用相同的类型.在这种情况下,它是不必要的和浪费的,但如果你聚合了多个密钥,它可能是一个有趣的方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读