列表的值与索引之间的总和

时间:2017-02-20 17:19:35

标签: python-2.7 lambda sum reduce

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

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的引擎。

我做错了吗?

1 个答案:

答案 0 :(得分:1)

我不知道你使用reduce的原因。 reduce也适用于列表,因为它是一个整数列表,因此lambda表达式中至少y将是一个int eger,它不是可编写脚本的(你不能得到2[1] 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))]