使用枚举Python进行Reduce

2024-09-29 23:28:08 发布

您现在位置: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


Tags: lambda元素reduce列表objectisvaluenot
3条回答

诀窍是制作一个新的列表并在其中进行乘法运算

创建一个新列表,其中索引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的更改

最简单的:

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

reduce方法失败,因为它返回的int与它期望的两个输入(tuple)的类型不同。您可以通过以下方式完成:

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

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

更新:由于您实际上想要嵌套iterable的所有元素的同质乘积,因此以下内容更简单:

from itertools import chain
from operator import mul

reduce(mul, chain(*enumerate(lst, 1)))
# 36
ans = sum(i * x for i, x in enumerate(list, 1))

这并不完全是你所要求的,但它给出了你想要的结果

相关问题 更多 >

    热门问题