虽然 python 中的条件在 true 时停止循环

While condition in python doest stop the loop when true

提问人:Agus RC 提问时间:11/7/2023 最后编辑:Agus RC 更新时间:11/7/2023 访问量:51

问:

我做了一个循环,一旦列表 U 中没有值,它就需要停止。一旦到达该点,循环就不会停止,并且会给出错误,因为有一个值为 0(最后一个循环中的 len(U))

def ATC(instance,K):
    pi=[]
    U = [i for i in range(instance.jobs)]
    t=0
    p= sum(instance.pt) / len(U)
    while len(U)!=0:
        I=[]
        for j in U:
            I.append((instance.w[j]/instance.pt[j])*exp(-(max(instance.dd[j]-instance.pt[j]-t,0))/(K*p)))
        k = np.argmax(I)        
        pi.append(U[k])         
        U.pop(k)                
        print(U,len(U))
        t = instance.Cmax(pi)         
        p = sum([instance.pt[i] for i in U])/len(U) ################################
        obj = instance.SumWjTj(pi)
    return pi,obj

在此处输入图像描述

这里是循环期间 u 和 len(U) 列表的打印,显示它达到 0,但 while 条件不起作用:

[0, 1, 2, 3, 4, 5, 7, 8, 9] 9
[0, 1, 2, 4, 5, 7, 8, 9] 8
[0, 1, 4, 5, 7, 8, 9] 7
[0, 1, 4, 7, 8, 9] 6
[0, 1, 4, 7, 9] 5
[0, 1, 4, 7] 4
[1, 4, 7] 3
[4, 7] 2
[7] 1
[] 0

使用有效,但我不明白为什么 while 还不够If len(U)!=0: p = sum([instance.pt[i] for i in U])/len(U)

python while-loop 字符串长度

评论

0赞 quamrana 11/7/2023
你怎么知道 while 不起作用?您的打印输出似乎在 0 处停止。如果有错误,请用详细信息更新您的问题。

答:

2赞 Matt Pitkin 11/7/2023 #1

循环不会在零时立即退出,并将继续完成循环的当前迭代。因此,在您的情况下,一旦为空,它仍将尝试执行以下行:len(U)U

t = instance.Cmax(pi)         
p = sum([instance.pt[i] for i in U])/len(U) ################################
obj = instance.SumWjTj(pi)

在它重新测试并退出之前。所以,在计算时,它会尝试除以零,我认为这是你得到的错误。len(U)!=0p

相反,您可以在循环中放置一个 break 子句,例如:

while True:
    I=[]
    for j in U:
        I.append((instance.w[j]/instance.pt[j])*exp(-(max(instance.dd[j]-instance.pt[j]-t,0))/(K*p)))
    k = np.argmax(I)        
    pi.append(U[k])         
    U.pop(k)                
    print(U,len(U))

    # break out the loop here
    if len(U) == 0:
        break

    t = instance.Cmax(pi)         
    p = sum([instance.pt[i] for i in U])/len(U) ################################
    obj = instance.SumWjTj(pi)