【问题标题】:Reduce with enumerate Python用枚举 Python 减少
【发布时间】:2020-06-27 19:36:00
【问题描述】:

我正在尝试获取列表的乘积,其中每个元素都乘以它的索引 + 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

【问题讨论】:

  • 你能给出一个示例列表和你想要的结果吗?
  • 没有'a'的位置,可能是单个数字检查一次
  • 您显然想要这些产品的总和!否则,如果在某处乘以索引 0,您将始终得到 0。
  • 为什么不只是 sum 和生成器表达式:sum(index * value for index, value in enumerate(data))
  • 代替 sum 做 numpy.prod([i*v for i, v in enumerate(lst, 1)])

标签: python lambda reduce enumerate


【解决方案1】:

最简单的:

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 用作下一步的辅助因素。

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

from itertools import chain
from operator import mul

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

【讨论】:

  • OP 想要索引 + 1。
  • @blueteeth 改编 ;)
  • 这就是我试图实现的目标。我仍然希望产品不是总和,但将 '+' 替换为 '*' 就足够了,所以谢谢你的帮助
  • 代替 sum 做 numpy.prod([i*v for i, v in enumerate(lst, 1)])
【解决方案2】:

诀窍是创建一个新列表并通过它进行乘法运算。

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

【讨论】:

    【解决方案3】:
    ans = sum(i * x for i, x in enumerate(list, 1))
    

    不完全是您要求的,但它给出了预期的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-16
      • 2021-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-08
      • 1970-01-01
      • 2017-04-18
      相关资源
      最近更新 更多