我正在尝试将此代码转换为不那么庞大的格式,我知道我们可以通过使用字典来删除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-我正在考虑使用二进制搜索,但无法在代码中进行表达。
答案 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)
也许您正在寻找类似的东西?
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
语句返回,因此无需执行elif
和else
。这在功能上是相同的:
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`
删除elif
和else
以及浮点转换后,我觉得您的原始代码比原始版本更干净,更易于阅读。但是那个&#39;主观的。