在這裏討論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
長度會有所不同也
在這裏討論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
長度會有所不同也
當密鑰是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
可以通過先列表進行排序,這樣做,然後使用二進制搜索:
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
,但如果你經常打電話,它最終將捨去個人數字。
看看[這裏](http://stackoverflow.com/questions/12141150/from-list-of-integers-get-number-closest-to-a-given-value) – nlsdfnbch
Excatly我需要什麼 – bluesummers