使用枚举减少 Python

Reduce with enumerate Python

我正在尝试获取列表的乘积,其中每个元素都乘以其索引 + 1。我尝试使用 reduce 和 enumerate

value = reduce(lambda a, b: (a[0]+1)*a[1]*b[1], enumerate(list))

但它给出 TypeError: 'int' object is not subscriptable。 是否可以一行完成?

Editv2

列表示例 [1,2,3]

想要输出list[0]*1 * list[1]*2 * list[2]*3 = 36

ans = sum(i * x for i, x in enumerate(list, 1))

虽然不完全符合您的要求,但它给出了您想要的结果。

最简单的:

lst = [1,2,3]  # do not shadow `list`
sum(i*v for i, v in enumerate(lst, 1))
# 14

您的 reduce 方法失败了,因为它 returns 一个 int 与它预期的两个输入 (tuple) 的类型不同。你可以这样做:

reduce(lambda a, b: (a[0]*a[1] + b[0]*b[1], 1), enumerate(lst, 1))[0]
# 14

注意 lambda 表达式的 (..., 1) 结构,其中 1 作为下一步的辅助因素。

更新: 由于您实际上想要嵌套可迭代对象的所有元素的同质积,因此以下更简单:

from itertools import chain
from operator import mul

reduce(mul, chain(*enumerate(lst, 1)))
# 36

诀窍是创建一个新列表并乘以它。

创建一个新列表,其中索引 i 处的数字为 i*list[i],索引从 1:

开始
>>> new_list = [a*b for a, b in enumerate(list, 1)]
>>> new_list
[1, 4, 9]

并乘以你的新列表:

>>> reduce((lambda x, y: x*y), new_list)
36

一行:

>>> reduce((lambda x, y: x*y), [a*b for a, b in enumerate(list, 1)])
36

希望对您有所帮助:)

注意:已编辑答案以满足 OP 的更改。