为不同范围编写“嵌套if”的最佳方法

时间:2018-02-22 20:57:33

标签: python if-statement

我将在python中写下这个伪代码:

if (i < .1):
   doX()
elif (i < .3):
   doY()
elif (i < .5):
    doZ()
.
.
else:
    doW()

数字范围可以是20,并且从列表中读取形成约束的每个浮点数。对于上面的示例(较短版本),它是列表:

[0.1, 0.3, 0.5, 1]

是否有任何pythonic方式或函数可以为不同的相关范围执行不同的功能?

4 个答案:

答案 0 :(得分:3)

from bisect import *
a=[0.1, 0.3, 0.5, 1]
b=["a","b","c","d"]
print b[bisect_left(a,0.2)]

答案 1 :(得分:1)

这是一个你不应该使用的答案:

ggplot(foo, aes(x = a)) + 
  geom_line(aes(y = b, linetype = "b")) + 
  geom_line(aes(y = c, linetype = "c")) + 
  scale_linetype_manual(values = c(1,5))

关键是,对它的幻想变得难以理解。 if..elif..else是&#34; one - 最好只有一种 - 显而易见的方式。&#34;

答案 2 :(得分:1)

def a():
    print('a returned')

def b():
    print('b returned')

def c():
    print('c returned')

funcs = [a, b, c]

def sample_func(x, funcs=None):
    if x < 0:
        return None    
    thresholds = [.40, .60]

    for i, threshold in enumerate(thresholds):
        if x <= threshold:
            return funcs[i]()
    return funcs[len(thresholds)]()

sample_func(.1, funcs)

返回

a returned

sample_func(.65, funcs)

返回

c returned

答案 3 :(得分:1)

我建议您创建以下字典,其中数字为键,函数为值:

d = {0.1:doX, 0.3:doY, 0.5:doZ, 1:doW}

然后使用以下代码:

for n,(k,f) in enumerate(sorted(d.items())):
    if (i < k) or (n == (len(d) - 1)):
        f()
        break