一般 python 具有许多区间情况的函数 returns 具体值取决于区间

General python function with many interval cases that returns specific values depending on interval

我在 Python 中编写函数时遇到问题,该函数基于输入 x 输出 y,具体取决于输入 x 所处的时间间隔。截至目前,代码如下所示

def getPowerLimit(x):
                    if 0.009 <= x <= 380.2:
                        return -39
                    elif 380.2 < x <= 389.8:
                        return -94
                    elif 389.8 < x <= 390.2:
                        return -39
                    elif 390.2 < x <= 399.8:
                        return -60
                    elif 399.8 < x <= 410.2:
                        return -39

这需要以不同的间隔进行,最高可达 12000 左右。每个间隔都有不同的 return 值,这意味着我会有很多不同的情况。这当然不是解决这个问题的最佳方法,所以我想知道是否有其他更快的方法来解决这个问题。

你可以为此实现二进制搜索:(注意:将其用作 psuado 代码,它可能包含错误):

intervals = [0.009, 380.2, 389.8, 390.2, 399.8, 410.2]
values = [-39, -94, -39, -60, -39]


def binary_serach(x, intervals, values):
    if len(values) == 1:
        return values[0]
    i = len(intervals) / 2

    if x < intervals[i]:
        return binary_serach(x, intervals[:i], values[:i]):
    if x >= intervals[i]:
        return binary_serach(x, intervals[i:], values[i:]):

正如 dlask 在您的问题中的评论所建议的,您可以使用 bisect 库:

boundaries = [0.009, 380.2, 389.8, 390.2, 399.8, 410.2]
values = [None, -39, -94, -39, -60, -39, None]

# what you need
import bisect
values[bisect.bisect_left(boundaries, x)]

假设您可以使用 CSV 等外部源构建 boundariesvalues

您可以将限制构建为元组列表:

# [((low,hight),result),...]

limits = [((0.009, 380.2),-39), ((380.2,389.8),-94),...]

然后很容易添加新的限制并检查给定的 x 是否在限制范围内。