一般 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 等外部源构建 boundaries
和 values
。
您可以将限制构建为元组列表:
# [((low,hight),result),...]
limits = [((0.009, 380.2),-39), ((380.2,389.8),-94),...]
然后很容易添加新的限制并检查给定的 x
是否在限制范围内。
我在 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 等外部源构建 boundaries
和 values
。
您可以将限制构建为元组列表:
# [((low,hight),result),...]
limits = [((0.009, 380.2),-39), ((380.2,389.8),-94),...]
然后很容易添加新的限制并检查给定的 x
是否在限制范围内。