2015-07-02 12 views
0

我在使用Python編寫函數時遇到了問題,該函數基於輸入x輸出ay,具體取決於輸入x所處的時間間隔。代碼如下所示具有許多間隔情況下的一般python函數,根據間隔返回特定值

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

[給定的邊界,找到間隔]的可能重複(http://stackoverflow.com/questions/13942698/given-boundaries-find-interval) – dlask

+0

@dlask不完全,這裏還有每個間隔的返回值。 – dhke

+0

我想它看起來很相似。但是,在我的例子中,間隔有一個非常具體的返回值:/ – Lucas

回答

4

如由你的問題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)] 

假設你可以構建boundariesvalues與像CSV一些外部來源。

+1

'values'的修改列表允許我們避免「減號」部分:'[None,-39, -94,-39,-60,-39,無]'。 – dlask

+0

@Gall好了,好的,但是整個區間內的值似乎沒有被定義。 – dlask

+0

哇這真的很整齊。謝謝你的包! – Lucas

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:]): 
0

你可以建立的限度元組的列表:

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

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

然後,它可以方便地添加新的限制和檢查一個給定的x是在一個範圍的限制。