我获得了一个数字列表(((...(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}}
答案 0 :(得分:3)
当然,棘手的一点是你必须在reduce
中的两个函数之间交替。由于您无法真正跟踪列表 1)中的当前位置,因此为了决定使用哪个操作,最好的机会是使用在+
之间交替的迭代器和*
。
您可以使用itertools.cycle
在add
和mul
之间切换,并使用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
如果您无法使用这些模块,则可以使用三元表达式中的+
在*
和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)
我们需要添加奇数个元素,并将偶数个元素与之前的元素相乘。