首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python中的“while”循环和列表索引的问题

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

Stack Overflow用户
提问于 2018-12-05 06:18:47
回答 4查看 80关注 0票数 3

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

我应该在我的循环中改变什么?

代码语言:javascript
复制
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)
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-12-05 06:48:09

while循环的另一种选择,因为它似乎是一个选择问题:

代码语言:javascript
复制
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列表映射为具有以下两个值的元组列表:所需直径与公称直径之间的绝对值(abs())差以及公称直径本身((abs(d-calc_diameter), d))。

然后从列表中选择最小(min())元组,最后从最小选取第二个元素([1]),即公称直径。

例如,这是calc_diameter = 130的映射

代码语言:javascript
复制
[(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)]
                      ^^^^^^^^
票数 1
EN

Stack Overflow用户

发布于 2018-12-05 06:39:19

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

代码语言:javascript
复制
while True:
        if nominal_diameters[i] <= calc_diameter <= nominal_diameters[i + 1]:
            nominal_diameter = nominal_diameters[i]
            break
        i = i + 1

这应该能解决这个问题

票数 1
EN

Stack Overflow用户

发布于 2018-12-05 06:39:41

问题在于:

代码语言:javascript
复制
while nominal_diameters[i] <= calc_diameter <= nominal_diameters[i+1]:

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

代码语言:javascript
复制
while 90 <= 300 <= 110:

这会立即失败,把你留给0

你可以这样做来解决这个问题:

代码语言:javascript
复制
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]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53626270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档