Python减少数学方程

时间:2017-08-31 14:58:55

标签: python lambda reduce

我获得了一个数字列表(((...(a[0] + a[1]) * a[2] + a[3]) * a[4] + ...)并仅使用Python的 reduce 函数,返回一个值。该值的计算方法如下: a = [1, 2, 3, 4, 5, 6]

因此,在((1 + 2) * 3 + 4) * 5 + 6 = 71的上述示例中,答案应为reduce(lambda x,y: x * y, map(lambda x,y: x+y, numbers))



我是Python的新手,我正在努力学习它:
{{1}}

3 个答案:

答案 0 :(得分:3)

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

您可以使用itertools.cycleaddmul之间切换,并使用reduce

中的{0}}
>>> 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

如果您无法使用这些模块,则可以使用三元表达式中的+*lambda之间交替生成表达式。其余的保持不变。

>>> 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

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

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

答案 1 :(得分:0)

这是一个棘手的问题,因为您想使用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)))

答案 2 :(得分:0)

改进Akash Patel的解决方案,我想出了这一点,只是减少了。

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

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