2017-08-31 151 views
-4

我給出了一個數字列表a = [1, 2, 3, 4, 5, 6]並僅使用Python的減少函數,返回一個值。該值的計算方法是: (((...(a[0] + a[1]) * a[2] + a[3]) * a[4] + ...)

所以在上面的例子a = [1, 2, 3, 4, 5, 6],答案應該是((1 + 2) * 3 + 4) * 5 + 6 = 71Python減少數學公式



我是相當新的Python和我想學習它:
reduce(lambda x,y: x * y, map(lambda x,y: x+y, numbers))

+2

那麼,你已經做了什麼? – Xire

+0

我對Python相當陌生,我試圖去了解它: 'reduce(lambda x,y:x * y,map(lambda x,y:x + y,numbers))' – Eduardo

+0

[編輯]( https://stackoverflow.com/posts/45984550/edit)你的問題,並在那裏添加你的代碼,但繼續收到downvotes。 – eyllanesc

回答

2

棘手的一點是,當然,你必須在reduce兩個函數之間交替。由於您無法真正跟蹤列表1)中的當前位置,要決定要使用哪個操作,最好的機會是使用在+*之間交替的迭代器。

你可以使用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 

如果您無法使用這些模塊,你可以做一個生成器表達式+*之間交替使用lambda S IN一個三元的表達。其餘的依然如此。

>>> 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 S,但這隻適用於Python 2.x:

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

只使用減少 – Eduardo

+2

你不能用* only *'reduce'做任何事情;究竟是什麼*被允許用來定義函數參數? – chepner

+0

只是減少是允許的。 – Eduardo