之前可能已经问过这个问题了,但我找不到了。 我正在尝试实现确定给定值的范围的东西。在这个例子中,x可以是任何实数。
def f(x):
if x < 0.1:
do_something_1()
elif 0.1 <= x < 1:
do_something_2()
elif 1 <= x < 10:
do_something_3()
elif x >= 10:
do_something_4()
...你明白了。
我已经看到很多字典替换Python中的switch语句的例子,但我总是将字典理解为索引离散值。
我发现很难相信if-elif-else链是这种情况下的最佳解决方案。有谁知道更好的一个?
答案 0 :(得分:12)
改善这种情况的一种简单方法是不重复下限。您的代码等同于
if x < 0.1:
do_something_1()
elif x < 1:
do_something_2()
elif x < 10:
do_something_3()
else:
do_something_4()
如果确实有很多值,您可能需要bisect
,但只有四个选项,上述代码可能是最好的解决方案,至少在可读性和速度方面。
答案 1 :(得分:9)
使用bisect包查找值所在的索引,然后调用相应的函数。在您的示例中:
import bisect
def f(x):
funcs = [do_something_1, do_something_2, do_something_3, do_something_4]
funcs[bisect.bisect_left([.1, 1, 10], x)]()
答案 2 :(得分:1)
这是另一种方法,使用dict和for循环:
ranges_dict = {
0.1: do_something1,
1.0: do_something2,
10.0: do_something3,
}
for range_val, do_function in sorted(ranges_dict.items()):
if x < range_val:
do_function()
break
else:
do_something_else()