在不等式条件下删除多个If

时间:2017-03-24 08:37:47

标签: python-2.7 if-statement

我正在尝试将此代码转换为不那么庞大的格式,我知道我们可以通过使用字典来删除ifs,但只有在你有相同的情况下才会这样做。如果你正在寻找一些范围检查,应该选择什么。 我的代码如下:

def dispersion(x):
   v = float(x) / 100
   if v <= -.20:
     return '< -20%'
   elif -.20 < v <= -.10:
     return '-20% to -10%'
   elif -.10 < v <= -0.05:
     return '-10% to -5%'
   elif -.05 < v <= .0:
     return '-5% to 0%'
   elif 0 < v <= .05:
     return '0% to 5%'
   elif .05 < v <= .10:
     return '5% to 10%'
   elif .10 < v <= .20:
     return '10% to 20%'
   else:
     return '> 20%'

P.S-我正在考虑使用二进制搜索,但无法在代码中进行表达。

2 个答案:

答案 0 :(得分:3)

你可以使用bisect(使用二进制搜索在有序列表中返回插入索引),并且在调整边缘情况后,工作代码看起来像这样(注意你不必除以100,只是将所有内容保持为整数,显示更容易):

import bisect

def dispersion(x):
    values = [-20,-10,-5,0,5,10,20]
    i = bisect.bisect(values,x)
    if i==0:
        return '< {}%'.format(values[0])
    elif i==len(values):
        return '>= {}%'.format(values[-1])
    else:
        return '{}% to {}%'.format(values[i-1],values[i])

在-50,50范围内测试:

for i in range(-50,50,10):
    print(i,dispersion(i))

结果:

-50 < -20%
-40 < -20%
-30 < -20%
-20 -20% to -10%
-10 -10% to -5%
0 0% to 5%
10 10% to 20%
20 >= 20%
30 >= 20%
40 >= 20%

答案 1 :(得分:0)

也许您正在寻找类似的东西?

def dispersion(x):       如果x&lt; -20:         返回&#39;&lt; -20%&#39;

  lowerBound = 20
  for upperBound in [-10, -5, 0, 5, 10, 20]:
    if lowerBound < x <= upperBound:
      return str(lowerBound) + "% to " + str(upperBound) + "%"
    upperBound = lowerBound

  return '> 20%'

< -20> 20的字符串与其他字符串不同,它们必须有自己的条件检查。其他的一定可以在一个范围内进行检查。

但有些注意事项:

有没有真正的理由转换为花车?比较初始整数x就足够了。 (如果它是另一种类型,则将其转换为int。)

由于您要从每个if语句返回,因此无需执行elifelse。这在功能上是相同的:

if condition1:
  return 1
if condition2: # equivalent to `elif condition2`
  return 2
if condition3: # equivalent to `elif condition3`
  return 3
return other # equivalent to `else`

删除elifelse以及浮点转换后,我觉得您的原始代码比原始版本更干净,更易于阅读。但是那个&#39;主观的。