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

使用reduce在python中乘以成对元素,python,list,reduce,itertools,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,并且我无法导入任何其他模块。您可以reduce您自己的生成器,该生成器提供了iterable中对的总

对于以下列表:

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,并且我无法导入任何其他模块。

您可以
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
或者,如果您希望它更通用,您可以使用添加所有对,然后使用
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

可分两步完成:

  • 对列表中的连续项求和:
    [sum(a[i:i+2]),对于范围(0,len(a),2)内的i]
  • 应用缩减:
    reduce(lambda x,y:x*y,新列表)

  • 将它们组合在一起:

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

    您需要成对迭代,将数字相加,然后对结果进行乘法运算。不幸的是,我唯一可以使用的导入是reduce。您可以在问题中这样说。@T.J.没问题,我更新了答案,包括一个不依赖导入的版本。超级聪明的解决方案!我来这里是想说这个,除了我使用了
    int.\uu mul\uu
    而不是lambda,假设列表中的项目总是整数。可能最好使用
    sum(a[I:I+2])
    ,否则这对奇数长度的列表不起作用(目前抛出了一个索引器)。否则就是一个很好的解决方案!
    reduce(lambda x, y: x * y, [sum(a[i:i+2]) for i in range(0, len(a), 2)])