棘手的一點是,當然,你必須在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
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]
那麼,你已經做了什麼? – Xire
我對Python相當陌生,我試圖去了解它: 'reduce(lambda x,y:x * y,map(lambda x,y:x + y,numbers))' – Eduardo
[編輯]( https://stackoverflow.com/posts/45984550/edit)你的問題,並在那裏添加你的代碼,但繼續收到downvotes。 – eyllanesc