2017-02-27 64 views
0

在這裏討論Python 3。在給定的一組值中舍入一個數字

我期待數字舍入到給定的一組值,其可以變化

假設value_set = [x, y, z]和用於我正在尋找一個功能的示例x, y, z = 1, 3.12, 4起見,將圓一個給定的浮到最近數

custom_round(0) --> 1

custom_round(2.7) --> 3.12

注意,它應該是足夠一般是value_set長度會有所不同也

+0

看看[這裏](http://stackoverflow.com/questions/12141150/from-list-of-integers-get-number-closest-to-a-given-value) – nlsdfnbch

+0

Excatly我需要什麼 – bluesummers

回答

1

當密鑰是x-n(x是列表中的每個項目)的絕對值時,您可以使用min函數來查找列表中的最小值。

value_set = [1, 3.12, 4] 

def return_closest(n): 
    return min(value_set, key=lambda x:abs(x-n)) 

number_to_check = 3 
print (return_closest(number_to_check)) 

>>> 3.12 
0

可以通過先列表進行排序,這樣做,然後使用二進制搜索:

from bisect import bisect_left 

class CustomRound: 

    def __init__(self,iterable): 
     self.data = sorted(iterable) 

    def __call__(self,x): 
     data = self.data 
     ndata = len(data) 
     idx = bisect_left(data,x) 
     if idx <= 0: 
      return data[0] 
     elif idx >= ndata: 
      return data[ndata-1] 
     x0 = data[idx-1] 
     x1 = data[idx] 
     if abs(x-x0) < abs(x-x1): 
      return x0 
     return x1 

您可以比構建你CustomRound這樣的:

values = [1,3.12,4] 
custom_round = CustomRound(values) 

,並簡單地調用它:

>>> custom_round(0) 
1 
>>> custom_round(0.5) 
1 
>>> custom_round(1.5) 
1 
>>> custom_round(2.5) 
3.12 
>>> custom_round(3.12) 
3.12 
>>> custom_round(3.9) 
4 
>>> custom_round(4.1) 
4 
>>> custom_round(4.99) 
4 

此方法將在O(log n)四捨五入O(n log n)建設。所以你會投入一些額外的時間來構建custom_round,但如果你經常打電話,它最終將捨去個人數字。