使用枚举减少 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 的更改。
我正在尝试获取列表的乘积,其中每个元素都乘以其索引 + 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 的更改。