我在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左右。每个都有不同的返回值,这意味着我会有很多不同的情况。这肯定不是解决这个问题的最佳方法,所以我想知道是否有一种不同的,更快的方法来解决这个问题。
答案 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等外部资源构建values
和A 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
是否在一定范围内。