Python中的“ while”循环和列表索引问题

时间:2018-12-05 06:18:48

标签: python

我的循环有问题。我想将nominal diameter的值设置为nominal_diameters。例如我的calc_diameter=130,所以我想要nominal_diameter=125。 到目前为止,我在这段代码中得到nominal_diameter = 0

我应该在循环中更改什么?

import math

print('Welcome in PipeDiameter program. It helps you to choose the right size of pipe for'
      ' sewerage pressure systems.')
flow=round(float(input('Please enter your sewage flow [(m^3)/s]:')),2)
speed_assumed = 1
calc_diameter=round(math.sqrt(((4*flow)/((math.pi)*speed_assumed))*1000),2)
print(str(calc_diameter)+' mm')

nominal_diameters=[90,110,125,160,180,200,225,250,315,355,400,450,500,560,630,710,800]
inner_diameters=[(90-2*5,4),(110-2*6,6),(125-2*7,4),(160-2*9,5),(180-2*10,7),(200-2*11,9),
                 (225-2*13,4),(250-2*14,8),(315-2*18,7),(355-2*21,1),(400-2*23,7),(450-2*26,7),
                 (500-2*29,7),(560-2*33,2),(630-2*37,4),(710-2*42,1),(800-2*47,4)]

nominal_diameter=0
i=0

while nominal_diameters[i]<=calc_diameter<=nominal_diameters[i+1]:
    nominal_diameter=nominal_diameters[i]
    i=i+1
print(nominal_diameter)

4 个答案:

答案 0 :(得分:1)

问题是,如果不满足第一个值的条件,则永远不会输入循环,因此您的公称直径将等于0。您可以按以下方式更改代码

while True:
        if nominal_diameters[i] <= calc_diameter <= nominal_diameters[i + 1]:
            nominal_diameter = nominal_diameters[i]
            break
        i = i + 1

这应该可以解决问题

答案 1 :(得分:1)

问题出在这里:

while nominal_diameters[i] <= calc_diameter <= nominal_diameters[i+1]:

假设calc_diameter = 300,在这种情况下,语句显示为

while 90 <= 300 <= 110:

哪一个会立即失败,而使您剩下0

您可以通过执行以下操作来解决此问题:

for i in range(len(nominal_diameters)-1):
    if nominal_diameters[i] <= calc_diameter <= nominal_diameters[i+1]:
        nominal_diameter = nominal_diameters[i]
        break
else:
    if calc_diameter < nominal_diameters[0]:
        nominal_diameter = nominal_diameters[0]
    else:
        nominal_diameter = nominal_diameters[-1]

答案 2 :(得分:1)

我了解到,根据calc_diameter,您发现nominal_diameters列表的值是最接近该值的。您可以按以下步骤进行操作(例如calc_diameter=130):

import numpy as np

nominal_diameters=[90,110,125,160,180,200,225,250,315,355,400,450,500,560,630,710,800]
calc_diameter = 130

best_approx = np.argmin([np.abs(d-calc_diameter) for d in nominal_diameters]) # Provides the index in nominal_diameters with value closest to calc_diameter
print(nominal_diameters[best_approx]) # Outputs 125

答案 3 :(得分:1)

while循环的替代方法,因为似乎是选择问题:

nominal_diameters=[90,110,125,160,180,200,225,250,315,355,400,450,500,560,630,710,800]

calc_diameter = 130
select_diam = min([(abs(d-calc_diameter), d) for d in nominal_diameters ])[1]

print(select_diam) #=> 125

对于calc_diameter = 195,它返回200

工作方式

通过list comprehension,它会将nominal_diameters的列表映射到具有以下两个值的元组列表:所需直径和公称直径之间的绝对(abs())差和公称直径本身({{1)}。

然后从列表中选择最小((abs(d-calc_diameter), d))元组,最后从最小中选择第二个元素(min()),即公称直径。

例如,这是[1]的地图:

calc_diameter = 130