2024-09-29 23:28:08 发布
网友
我试图得到列表的乘积,其中每个元素都乘以它的索引+1。我试着用reduce和enumerate
value = reduce(lambda a, b: (a[0]+1)*a[1]*b[1], enumerate(list))
但它给出了TypeError: 'int' object is not subscriptable。 可以用一行来做吗
TypeError: 'int' object is not subscriptable
Editv2
列表[1,2,3]的示例
[1,2,3]
期望输出list[0]*1 * list[1]*2 * list[2]*3 = 36
list[0]*1 * list[1]*2 * list[2]*3 = 36
诀窍是制作一个新的列表并在其中进行乘法运算
创建一个新列表,其中索引i处的数字为i*list[i],索引从1开始:
i*list[i]
>>> 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)的类型不同。您可以通过以下方式完成:
int
tuple
reduce(lambda a, b: (a[0]*a[1] + b[0]*b[1], 1), enumerate(lst, 1))[0] # 14
注意lambda表达式的(..., 1)结构,其中1作为下一步的辅助因子
(..., 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))
这并不完全是你所要求的,但它给出了你想要的结果
诀窍是制作一个新的列表并在其中进行乘法运算
创建一个新列表,其中索引i处的数字为
i*list[i]
,索引从1开始:然后乘以您的新列表:
一行:
希望有帮助:)
注:编辑答案以满足OP的更改
最简单的:
reduce方法失败,因为它返回的
int
与它期望的两个输入(tuple
)的类型不同。您可以通过以下方式完成:注意lambda表达式的
(..., 1)
结构,其中1
作为下一步的辅助因子更新:由于您实际上想要嵌套iterable的所有元素的同质乘积,因此以下内容更简单:
这并不完全是你所要求的,但它给出了你想要的结果
相关问题 更多 >
编程相关推荐