尝试,但失败时使用新条件重试

2024-09-29 23:19:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图编写一个算法,将数组最大值(包括最大值)左右的所有值相加。当满足条件时,求和应停止。例如:

import numpy as np


data = [-1, 1, 2, 3, 4, 5, 4, 3, 2, 2, 4, 1, -1]

summ1 = 0
summ2 = 0
j = 1
k = 0
n = 0

for i in range(len(data)):

    if data[i] == np.amax(data):

        while data[i + j] > 1:
            summ1 = summ1 + data[i + j]
            j += 1

        while data[i - k] > 1:
            summ2 = summ2 + data[i - k]
            k += 1
        
total = summ1 + summ2 

这个很好用。但根据情况,这可能会引发IndexError。例如:

import numpy as np


data = [-1, 1, 2, 3, 4, 5, 4, 3, 2, 2, 4, 1, -1]

summ1 = 0
summ2 = 0
j = 1
k = 0
n = 0

for i in range(len(data)):

    if data[i] == np.amax(data):

        while data[i + j] > -2:
            summ1 = summ1 + data[i + j]
            j += 1

        while data[i - k] > 1:
            summ2 = summ2 + data[i - k]
            k += 1
        
total = summ1 + summ2 

现在,我正试图找出一种方法来操纵循环中的条件,直到它可以进入while循环。我想到过这样的事情:

data = [-1, 1, 2, 3, 4, 5, 4, 3, 2, 2, 4, 1, -1]

summ1 = 0
summ2 = 0
j = 1
k = 0
n = 0

while True:
    try:

        for i in range(len(data)):

            if data[i] == np.amax(data):

                while data[i + j] > -2 + n:
                    summ1 = summ1 + data[i + j]
                    j += 1


                while data[i - k] > 3:
                    summ2 = summ2 + data[i - k]
                    k += 1
        

        total = summ1 + summ2 
        break

    except IndexError:
        n = n + 1

但这不起作用,我也不明白为什么。其思想是增加n,当引发IndexError时,重新输入try-语句并检查while条件是否可以满足(在本例中,如果while data[i + j] > -1:,那么n == 3),最后中断while循环。但是它只是不断地增加我的n,并且while条件永远不会满足。这是一个非常人为的例子,但我需要知道为什么这不起作用


Tags: inimportfordatalenifnprange
3条回答

在当前代码中,j永远不会重置为零,第一个while循环将继续抛出索引错误

我不清楚这个逻辑的目的是什么,但是重置jk似乎可以解决索引问题

请尝试以下代码:

import numpy as np

data = [-1, 1, 2, 3, 4, 5, 4, 3, 2, 2, 4, 1, -1]

summ1 = 0
summ2 = 0
j = 1
k = 0
n = 0

print (np.amax(data))  # 5

while True:
    print('w > ', n)
    try:

        for i in range(len(data)):

            if data[i] == np.amax(data):

                while data[i + j] > -2 + n:
                    print('w1', i, j)
                    summ1 = summ1 + data[i + j]
                    j += 1

                while data[i - k] > 3:
                    print('w2', i, k)
                    summ2 = summ2 + data[i - k]
                    k += 1
        
        total = summ1 + summ2 
        break

    except IndexError:
        n = n + 1
        j = k = 0
        print('ex',n)        

print('total',total)

输出

5
w >  0
w1 5 1
w1 5 2
w1 5 3
w1 5 4
w1 5 5
w1 5 6
w1 5 7
ex 1
w >  1
w1 5 0
w1 5 1
w1 5 2
w1 5 3
w1 5 4
w1 5 5
w1 5 6
w2 5 0
w2 5 1
total 45

这是因为当异常发生时,j和k的值不会重置,因此异常会继续发生

在以下情况下检查索引限制:

    while i+j < len(data) and data[i + j] > -2 + n:
        summ1 = summ1 + data[i + j]
                j += 1


    while i-k > 0 and data[i - k] > 3:
        summ2 = summ2 + data[i - k]
        k += 1

此解决方案不需要异常处理

发生的情况是,当您递增j时,您最终到达数组的末尾(因为所有值都大于-2)。这会触发一个IndexError(对于您提供的示例数据,您最终搜索的索引是13,但列表中只有13个项目,因此这当然不起作用)

递增n在代码中不起作用的原因是您从不重置j。因此,您将n增加1,但是当您重新进入forloop时,j已经是8,因此一旦您到达i = 5,就会再次出现一个IndexError,它将您发送到except语句,递增n并重新启动该过程

我不知道为什么您首先要使用递增n的代码。如果要查找与您的条件匹配的元素的总和,只需在while循环中添加一个简单的检查,这样可以防止索引错误,如下所示:

import numpy as np


data = [-1, 1, 2, 3, 4, 5, 4, 3, 2, 2, 4, 1, -1]

summ1 = 0
summ2 = 0
j = 1
k = 0
n = 0

for i in range(len(data)):

    if data[i] == np.amax(data):

        while i + j < len(data):
            if data[i + j] > -2:
                summ1 = summ1 + data[i + j]
                j += 1
            else:
                break    

        while i - k >= 0:
            if data[i - k] > 1:
                summ2 = summ2 + data[i - k]
                k += 1
            else:
                break  

total = summ1 + summ2

这样,如果i + j >= len(data)(否则会触发索引错误),列表甚至不会被索引。你也应该用i - k部分来做。否则,如果使用负索引,则不会出现索引错误,但会从列表末尾开始添加项

如果您想使用递增n(我个人认为这是一个奇怪的解决方案),您可以。只需将j = 1放入外部while循环中:

data = [-1, 1, 2, 3, 4, 5, 4, 3, 2, 2, 4, 1, -1]

n = 0

while True:
    
    summ1 = 0
    summ2 = 0
    j = 1
    k = 0
    
    try:

        for i in range(len(data)):

            if data[i] == np.amax(data):

                while data[i + j] > -2 + n:
                    summ1 = summ1 + data[i + j]
                    j += 1


                while data[i - k] > 3:
                    summ2 = summ2 + data[i - k]
                    k += 1


        total = summ1 + summ2
        break

    except IndexError:
        n = n + 1

相关问题 更多 >

    热门问题