使用reduce在python中乘以成对元素

时间:2017-10-12 21:39:03

标签: python list reduce itertools

列表如下:

a = [1,2,3,4,5,6] 

我想使用下面的代码来增加像这样的成对元素:

(a[0] + a[1]) * (a[2] + a[3]) * (a[4] + a[5])

我尝试过使用类似的东西:

reduce((lambda x, y: (x+y)), numbers) 

reduce((lambda x, y: (x+y)*(x+y)), numbers) 

但我不知道如何让它在整个列表中运行。任何帮助将不胜感激。

整个解决方案必须符合reduce,我无法导入任何其他模块。

2 个答案:

答案 0 :(得分:4)

你可以reduce你自己的生成器给出你的iterable中对的总和:

def pairwise_sum(seq):
    odd_length = len(seq) % 2

    it = iter(seq)
    for item1, item2 in zip(it, it):
        yield item1 + item2
    if odd_length:
        yield seq[-1]

>>> reduce(lambda x, y: x*y, pairwise_sum([1,2,3,4,5,6]))
231

或者如果您希望它更通用,您可以使用grouper recipe添加所有对,然后使用reduce乘以所有总和:

from itertools import zip_longest
from functools import reduce
from operator import mul

def grouper(iterable, n, fillvalue=None):
    args = [iter(iterable)] * n
    return zip_longest(*args, fillvalue=fillvalue)

>>> reduce(mul, map(sum, grouper([1,2,3,4,5,6], 2, fillvalue=0)))
231

答案 1 :(得分:3)

可以分两步完成:

  1. 对列表中的连续项进行求和:[sum(a[i:i+2]) for i in range(0, len(a), 2)]
  2. 应用缩减:reduce(lambda x, y: x * y, new_list)
  3. 将它们组合在一起:

    reduce(lambda x, y: x * y, [sum(a[i:i+2]) for i in range(0, len(a), 2)])