2

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

4

3 回答 3

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改为,但只有四个选项,上面的代码可能是最好的解决方案,至少在可读性和速度方面。

于 2012-07-19T15:18:01.830 回答
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)]()
于 2012-07-19T15:16:40.320 回答
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()
于 2012-07-19T16:41:54.577 回答