Python找到最接近的小数匹配

时间:2011-03-28 10:16:38

标签: python django django-models decimal

我有一个如下列表:

CHOICES = (
    ('8.25', '0'),
    ('7.35', '1'),
    [...]
)

我使用的模型存储元组中的第一个值(例如8.25 - 以毫米为单位,以毫米为单位)。我需要一个函数,它接受任何给定的十进制值(可能不在列表中)并将其与CHOICES列表中最接近的值匹配,以返回相关的整数。

示例输入可以是8.11,它会返回07.30,这会返回1等。

3 个答案:

答案 0 :(得分:4)

除非你的价值被排序并且假设选择的数量不是很大:

result = sorted([(math.abs(k - input_val),v) for (k,v) in choices])[0]

否则将选项排序一次并使用二分搜索(bisect),如其他答案所示。看起来像是:

#do this part only once
choices_dict = dict(choices)
sorted_keys = sorted([ float(k) for (k,v) in choices])
#...
l,r = bisect_left(input_value,sorted_keys), bisect_right(input_value,sorted_keys)
k = l if math.abs(input_value-l)<math.abs(input_value-r) else r
result = choices_dict(str(k))

答案 1 :(得分:2)

答案 2 :(得分:0)

这很好用

distances = [ (abs(target-float(v)), m) for v,m in CHOICES ]
value, match = min( distances )

由于你使用“十进制”这个词,或许你的意思是这个。

distances = [ (abs(target-decimal.Decimal(v)), m) for v,m in CHOICES ]

并不重要。