列表如下:
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,我无法导入任何其他模块。
答案 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)
可以分两步完成:
[sum(a[i:i+2]) for i in range(0, len(a), 2)]
reduce(lambda x, y: x * y, new_list)
将它们组合在一起:
reduce(lambda x, y: x * y, [sum(a[i:i+2]) for i in range(0, len(a), 2)])