具有许多区间情况的常规python函数,它根据间隔返回特定值

时间:2015-07-02 08:23:17

标签: python function intervals

我在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左右。每个都有不同的返回值,这意味着我会有很多不同的情况。这肯定不是解决这个问题的最佳方法,所以我想知道是否有一种不同的,更快的方法来解决这个问题。

3 个答案:

答案 0 :(得分:4)

正如dlask在您的问题中的评论所暗示的那样,您可以使用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)] 库:

boundaries

假设您可以使用CSV等外部资源构建valuesA a; const A& ref_a = a; const double defaultAmount = [&]{ ref_a.smth(); }();

答案 1 :(得分:1)

您可以为此实现二进制搜索:(注意:将其用作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:]):

答案 2 :(得分:0)

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

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

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

然后,您可以轻松添加新限制并检查给定的x是否在一定范围内。