【问题标题】:how to stop iteration of for loop in python? (sliding window problem)如何在python中停止for循环的迭代? (滑窗问题)
【发布时间】:2021-05-30 22:44:30
【问题描述】:

当给定阵列= [0.771,0.812,0.812,0.847,0.847,0.847,0.849,0.847,0.887,0.862,0.863,0.892,0.874,0.874,0.899,0.945,0.910,0.872,0.887,0.874,0.872, 0.896、0.896、0.860、0.912、0.913、0.912、0.871、0.871、0.865、0.899、0.866]

我想通过滑动窗口算法找到最大值。(不是通过使用 np.max())

n = len(数组) k = 12(即窗口大小)

代码如下:

for i in range(n-k):
max = arr[i]
for j in range (1, k):
    if arr[i+j] >= max:
        max = arr[i+j]
print(str(max) + "", end="")

这将给出输出 = 0.892 0.892 0.892 0.899 0.945 0.945 0.945 0.945 0.945 0.945 0.945 0.945 0.945 0.945 0.945 0.945 0.913 0.913 0.913 0.913

根据输出,我们可以看到最大值为0.945。但是,当输出的最后一个元素小于前一个最后一个元素时,我想停止循环迭代。

0.892 0.892 0.892 0.899 0.945 0.945 0.945 0.945 0.945 0.945 0.945 0.945 0.945 0.945 0.945 0.945 0.913 0.913

0.913 0.913

粗体数字 (0.913) 是我要停止 for 循环迭代的位置。

谁能帮助我如何编写这部分代码? 谢谢

【问题讨论】:

  • 您确实意识到,当整体最大值出现在局部最大值小于迄今为止的全局最大值之后的某个点时,这将无法找到 blobab 最大值?
  • 您的编辑使您的问题完全没有意义。您是否不小心删除了问题的文字?

标签: python for-loop sliding-window


【解决方案1】:

创建另一个包含全局最大值的变量,并在新的局部最大值较低时退出。

gl_max = arr[0]
broken = False
for i in range(n-k):
    loc_max = arr[i]
    for j in range (1, k):
        if arr[i+j] >= loc_max:
            loc_max = arr[i+j]
            if loc_max < gl_max:
                broken = True
                break
            gl_max = loc_max
    if broken:
        break
    print(loc_max, end="")

这需要在两个嵌套循环之外对break 进行一些额外的逻辑。如果这是在函数内部,return 而不是最里面的break,并删除broken 逻辑。另见How to break out of multiple loops?

也许还注意到从print 中删除了不必要的箔条,并重命名了变量以避免遮蔽内置max 函数以及阐明全局与局部最大变量之间的区别。

【讨论】:

    【解决方案2】:
    globalValue = arr[0]
    flag = False
    for i in range(n-k):
        max = arr[i]
        if flag:
            break
        for j in range (1, k):
            if arr[i+j] >= max:
                max = arr[i+j]
        if max>=globalValue:
            print(str(max) + "", end="")
            globalValue = max
        else:
            print(str(max) + "", end="")
            flag = True
    

    globalValue 将存储当前打印的值并进行更新。flag 将检查是否打印了较低的值。有了这个,你就可以解决你的问题了。

    【讨论】:

    • 这对于负数数组将无法正常工作。
    猜你喜欢
    • 2020-07-13
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 1970-01-01
    • 2022-01-11
    相关资源
    最近更新 更多