【问题标题】:sum between list's values by index按索引在列表值之间求和
【发布时间】:2017-07-10 02:14:15
【问题描述】:

我正在尝试按索引汇总一堆列表,例如:

a = [[1,2,3], [2,3,4], [3,4,5]]

output = [ reduce(lambda x, y: x[_count] + y[_count], a) 
           if _count in [0,2] else "" for _count in xrange(len(a)) ]

它一定适合我,预期的输出是:

>>> output
[6, "", 12]

但我得到了:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <lambda>
TypeError: 'int' object has no attribute '__getitem__'

可能我不了解reduce的引擎。

我做错了吗?

【问题讨论】:

  • 为什么将reduce 与列表理解一起使用?
  • 我认为reduce会返回一个int,我需要迭代只是为了总结特定的索引。如果有类似的东西,我全神贯注
  • 等一下,你想怎么求和? a[0][0]+a[0][1]+...a[0][0]+a[1][0]+...
  • 你为什么要对索引求和?

标签: python-2.7 lambda sum reduce


【解决方案1】:

我不明白你为什么使用reducereduce 也适用于列表,并且由于它是整数列表,因此 lambda 表达式中的至少 y 将是一个不可编写脚本的 integer(例如,您无法获得 2[1])。

但是,您可以为此使用 sum列表理解

output = [sum(ai) if i in (0,2) else "" for i,ai in enumerate(a)]

如果您想对 转置 求和(因此两者等价),您还可以使用生成器而不是总和:

output = [sum(ai[i] for ai in a) if i in (0,2) else "" for i in range(len(a))]

或者如果你想计算a[0][0]+a[1][0]+a[2][0]+...等,你可以使用reduce,累加器应该以0开头并且你将y[_count]添加到x(不是x[_count]):

from functools import reduce

output = [reduce(lambda x,y:x+y[i],a,0) if i in (0,2) else "" for i in range(len(a))]

【讨论】:

  • 就是这样!我得到了它!太感谢了。只是想知道,为什么 x + y[i] 而不是 x[i] + y[i]?
  • @RenanQuirino:因为0累加器。由于声明初始值为0(第三个参数),因此在第一次调用中x 将是0y 第一个列表。所以你计算t=0+a[0][0]。结果t 你第二次传递为x(再次是int)等等。
猜你喜欢
  • 1970-01-01
  • 2016-08-25
  • 1970-01-01
  • 1970-01-01
  • 2014-08-20
  • 2021-08-26
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多