2017-02-27 7 views
0

ここにPython 3を話しています。数字を指定された値のセットに丸める

私は

value_set = [x, y, z]を想定し、例x, y, z = 1, 3.12, 4のために私は与えられたフロートを丸くする関数を探しています異なります値のセットに数値を四捨五入しているよ

value_set長さが変化することは十分汎用的でなければならないことに最も近い数

custom_round(0) --> 1

custom_round(2.7) --> 3.12

お知らせ

+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(N Nログ)を丸めるためO(ログn)で動作します。したがって、あなたはcustom_roundを構築するためにある程度の時間を投資しますが、それを頻繁に呼び出すと、最終的には個々の数値を丸めて返済します。

関連する問題