如何在不对元素位置进行硬编码的情况下嵌套循环

时间:2017-12-03 19:40:17

标签: python for-loop

我的问题是看到我在一个长号码中骑自行车,以找到所述号码中连续5位数的最大乘积。我有一个解决方案,但它目前涉及元素的硬编码'位置,感觉/看起来很可怕,并且不可扩展(如果我想要连续10个术语的总和怎么办?)。有没有办法去" Python"这个解决方案并嵌套或以某种方式优化它?

n = 82166370484403199890008895243450658541227588666881

N = str(n)
Pro = 0
for i in range(0, len(N) - 4):
    TemPro= int(N[i])*int(N[i+1])*int(N[i+2])*int(N[i+3])*int(N[i+4])
    if TemPro> Pro :
        Pro = TemPro
print(Pro )

操作系统:Windows 7
语言:Python 3

2 个答案:

答案 0 :(得分:0)

reduce切片上使用N的完美案例:

from functools import reduce # python 3
nb_terms = 5
for i in range(0, len(N) - nb_terms - 1):
    TemPro= reduce(lambda x,y:int(x)*int(y),N[i:i+nb_terms])
    if TemPro> Pro :
        Pro = TemPro
print(Pro)

reduce会将所有项目相乘,没有可见的循环,也不会对术语数量进行硬编码。

答案 1 :(得分:0)

你可以非常简洁地做到这一点,首先将整个整数转换为一系列数字,然后使用reducemul和切片计算滑动窗口的产品。

from functools import reduce
from operator import mul

n = 82166370484403199890008895243450658541227588666881

def largest_prod(n, length=5):
    digits = [int(d) for d in str(n)]
    return max(reduce(mul, digits[i:i + length]) for i in range(len(digits) - length + 1))

print(largest_prod(n))

请注意,这种查找数字的方法在理论上有点慢 - 对于所有意图和目的而言,它足够快,但它涉及一些不必要的对象创建。如果您真的关心性能,可以使用类似于我在my answer here中讨论的算术方法。