簡體   English   中英

Python中'while'循環和列表索引的問題

[英]Problem with 'while' loop and list index in 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)

問題是,如果第一個值不滿足條件,則永遠不會輸入循環,因此您的公稱直徑將評估為0.您可以更改以下代碼

 while True: if nominal_diameters[i] <= calc_diameter <= nominal_diameters[i + 1]: nominal_diameter = nominal_diameters[i] break i = i + 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]

據我所知,基於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

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

這個怎么運作

通過列表理解 ,它將nominal_diameters列表nominal_diameters到具有這兩個值的元組列表:所需直徑與公稱直徑之間的絕對( abs() )差值和公稱直徑本身( (abs(d-calc_diameter), d) )。

然后它選擇列表中的最小( min() )元組,最后從最小選擇第二個元素( [1] ),這是公稱直徑。

這是例如calc_diameter = 130的地圖:

[(40, 90), (20, 110), (5, 125), (30, 160), (50, 180), (70, 200), (95, 225), (120, 250), (185, 315), (225, 355), (270, 400), (320, 450), (370, 500), (430, 560), (500, 630), (580, 710), (670, 800)]
                      ^^^^^^^^

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM