通过列举列表的枚举来理解reduce

Jus*_*oIt 0 python reduce list enumerate

我试图将第一个列表的第一个数字1,第二个列表的第二个数字,5等相乘,以获得列表列表.例如,对于[[1,2,3],[4,5,6],[7,8,9]],我想获得1*5*9.

虽然有很多可能的方法可以做到这一点,但我想知道如何使用枚举进行reduce:

def test(m):
    return reduce(lambda a, b: a[1][a[0]]*b[1][b[0]], enumerate(m))

print test([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
Run Code Online (Sandbox Code Playgroud)

我认为a在开头是(0,[1,2,3])所以a [1]是[1,2,3],a [0]是0,所以a [1] [a [0]]是1.

但是,我得到以下异常:

return reduce(lambda a, b: a[1][a[0]]*b[1][b[0]], enumerate(mat))
TypeError: 'int' object has no attribute '__getitem__'
Run Code Online (Sandbox Code Playgroud)

为什么是a整数?

Ste*_*ann 5

您的最终值和中间值是简单的整数.所以你应该先开始1,然后lambda将始终得到一个整数a,即到目前为止的产品.而且b将成为下一个枚举项目.所以这是如何做到的:

>>> reduce(lambda a, b: a * b[1][b[0]],
           enumerate([[1, 2, 3], [4, 5, 6], [7,8,9]]), 1)
45
Run Code Online (Sandbox Code Playgroud)

Python 2仍然允许这样,顺便说一下:

>>> reduce(lambda a, (i, b): a * b[i],
           enumerate([[1, 2, 3], [4, 5, 6], [7,8,9]]), 1)
45
Run Code Online (Sandbox Code Playgroud)