【问题标题】:Python Reduce Math EquationPython减少数学方程
【发布时间】:2018-02-09 14:13:33
【问题描述】:

我得到了一个数字列表a = [1, 2, 3, 4, 5, 6],并且只使用 Python 的 reduce 函数,返回一个值。该值通过以下方式计算: (((...(a[0] + a[1]) * a[2] + a[3]) * a[4] + ...)

所以在上面a = [1, 2, 3, 4, 5, 6]的例子中,答案应该是((1 + 2) * 3 + 4) * 5 + 6 = 71



我对 Python 还很陌生,我正在努力学习它:
reduce(lambda x,y: x * y, map(lambda x,y: x+y, numbers))

【问题讨论】:

  • 所以?你已经做了什么?
  • 我对 Python 还很陌生,我正在努力学习它:reduce(lambda x,y: x * y, map(lambda x,y: x+y, numbers))
  • Edit 您的问题并在那里添加您的代码,但继续收到反对票。

标签: python lambda reduce


【解决方案1】:

当然,棘手的一点是,您必须在 reduce 中的两个函数之间切换。由于您无法真正跟踪列表中的当前位置1),为了决定使用哪个操作,您最好的机会是使用在+ 和@ 之间交替的迭代器987654324@.

您可以使用itertools.cycleaddmul 之间交替使用reduce 中的那些

>>> import itertools, operator
>>> op = itertools.cycle([operator.add, operator.mul])
>>> a = [1, 2, 3, 4, 5, 6]
>>> reduce(lambda x, y: next(op)(x, y), a)
71

如果您不能使用这些模块,您可以在三元表达式中使用lambdas 在+* 之间交替生成一个生成器表达式。其余的保持不变。

>>> op = ((lambda x,y:x+y) if i % 2 == 0 else (lambda x,y:x*y) for i in range(len(a)))
>>> a = [1, 2, 3, 4, 5, 6]
>>> reduce(lambda x, y: next(op)(x, y), a)
71

1) 好吧,如果您愿意,可以使用enumerate(a)zip(range(len(a)), a)...

>>> a = [1, 2, 3, 4, 5, 6]
>>> reduce(lambda x, y: (y[0], x[1]+y[1]) if x[0]%2==0 else (y[0], x[1]*y[1]), enumerate(a))[1]
71

或者更短,在lambdas 中使用元组解包,但这仅适用于 Python 2.x:

>>> reduce(lambda (i,x),(j,y): (j, x+y) if i%2==0 else (j, x*y), enumerate(a))[1]

【讨论】:

  • 只使用reduce
  • 你不能用 only reduce 做任何事情;究竟允许使用什么来定义函数参数?
  • 只允许减少。
  • @Eduardo 我认为您不了解reduce 的工作原理。您必须定义 some 函数作为第一个参数传递。
【解决方案2】:

这是一个棘手的问题,因为您想使用 reduce 中的所有内容。所以只需使用 reduce 两次!

reduce(lambda x, y: x + y, reduce(lambda x, y: (x[0], x[1] + y[1]) if y[0]%2==1 else (x[0], x[1]*y[1]) , enumerate(a)))

【讨论】:

    【解决方案3】:

    改进 Akash Patel 的解决方案,我想出了这个,只有减少。

    reduce(lambda acc,x: (acc+x[1] if x[0]%2 else acc*x[1]), enumerate(numbers), 1)
    

    我们需要添加奇数个元素并将偶数个元素与之前的元素相乘。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多