Python - 用于非离散比较的交换机替代方案

时间:2012-07-19 15:14:21

标签: python dictionary switch-statement

之前可能已经问过这个问题了,但我找不到了。 我正在尝试实现确定给定值的范围的东西。在这个例子中,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链是这种情况下的最佳解决方案。有谁知道更好的一个?

3 个答案:

答案 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()