gpt4 book ai didi

python - 如何使用函数式编程迭代并找到列表中五个连续数字的最大乘积?

转载 作者:太空狗 更新时间:2023-10-29 17:29:59 25 4
gpt4 key购买 nike

我必须使用函数式编程来实现以下函数,它接收从 0 到 9 的数字列表。目标是找到列表中具有最大乘积的五个连续元素。该函数应返回最大产品索引的元组和最大产品的值使用max函数。

我可以在没有函数式编程的情况下轻松实现它,但是我在没有任何循环的情况下实现它时遇到了麻烦。到目前为止,这是我的方法,但我坚持的部分是如何遍历数组以找到那些没有循环的连续五个数字。我正在尝试使用 map 来做到这一点,但我认为这是不正确的。是否可以以任何方式合并枚举?任何帮助表示赞赏。

def find_products(L):
val = map(lambda a: reduce(lambda x,y: x*y, L),L)
print (val)

最佳答案

这没有任何显式循环或调用 max 函数。该函数假定输入列表中至少有五个元素并输出一个元组 (start_index, max_product)

from functools import reduce, partial
import operator

def f(l):
win = zip(l, l[1:], l[2:], l[3:], l[4:])
products = map(partial(reduce, operator.mul), win)
return reduce(lambda x, y: x if x[1] > y[1] else y, enumerate(products))
In [2]: f([1, 2, 3, 4, 7, 8, 9])
Out[2]: (2, 6048)

In [3]: f([2, 6, 7, 9, 1, 4, 3, 5, 6, 1, 2, 4])
Out[3]: (1, 1512)

win = zip(l, l[1:], l[2:], l[3:], l[4:]) 在输入列表。 products = map(partial(reduce, operator.mul), win) 是一个调用 partial(reduce, operator.mul) 的迭代器(转换为 reduce(operator .mul, ...)) 在 win 的每个元素上。 reduce(lambda x, y: x if x[1] > y[1] else y, enumerate(products)) 添加一个计数器到 products 并返回索引-具有最高值的值对。

如果您需要更通用的版本和/或输入列表很大,您可以使用 itertools.islice:

from itertools import islice

def f(l, n=5):
win = zip(*(islice(l, i, None) for i in range(n)))
...

上面的代码使用了一个生成器表达式,从技术上讲,它是一个循环。一个纯功能版本可能看起来像

from itertools import islice

def f(l, n=5):
win = zip(*map(lambda i: islice(l, i, None), range(n)))
...

关于python - 如何使用函数式编程迭代并找到列表中五个连续数字的最大乘积?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47366553/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com