我正在尝试按索引排列一堆列表,例如:
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的引擎。
我做错了吗?
答案 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))]