程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

使用Python减少对列表

发布于2019-10-14 21:03     阅读(525)     评论(0)     点赞(12)     收藏(0)


我正在尝试将列表中的一堆元素配对在一起以创建最终对象,其方式类似于对对象求和。我正在尝试使用一个简单的变体,在reduce其中您考虑成对的列表而不是平面列表来执行此操作。我想按照以下方式做一些事情:

nums = [1, 2, 3]
reduce(lambda x, y: x + y, nums)

除了我要在数字列表中每个元素特定的总和上添加其他信息nums例如,对于列表中的每对(a,b),将总和运行为(a + b):

nums = [(1, 0), (2, 5), (3, 10)]
reduce(lambda x, y: (x[0]+x[1]) + (y[0]+y[1]), nums)

这不起作用:

>>> reduce(lambda x, y: (x[0]+x[1]) + (y[0]+y[1]), nums)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <lambda>
TypeError: 'int' object is unsubscriptable

为什么不起作用?我知道我可以编码nums为一个平面列表-这不是重点-我只想能够创建一个reduce操作,该操作可以遍历成对的列表,或者同时遍历两个相同长度的列表,并从这两个池中收集信息列表。谢谢。


解决方案


查看您传递给的lambda reduce

f = lambda x, y: (x[0]+x[1]) + (y[0]+y[1])

返回的值f将作为参数传递给的另一个调用f但是,虽然f期望其参数为对,但返回的值却是int您需要使该函数也返回一对。例如,这将分别汇总左侧和右侧:

>>> nums = [(1, 0), (2, 5), (3, 10)]
>>> reduce(lambda x, y: (x[0] + y[0], x[1] + y[1]), nums)
(6, 15)

您可以做的另一件事是,将累加值与列表元素区别对待:int当列表元素为对时,您可以将累加值设为an 如果这样做,则必须将initializer参数传递reduce,以便将累加器正确初始化为int

>>> nums = [(1, 0), (2, 5), (3, 10)]
>>> reduce(lambda acc, y: acc + y[0] + y[1], nums, 0)
21


所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/136813/2967794ca301c9de2991/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

12 0
收藏该文
已收藏

评论内容:(最多支持255个字符)