我有一个如下列表:
CHOICES = (
('8.25', '0'),
('7.35', '1'),
[...]
)
我使用的模型存储元组中的第一个值(例如8.25 - 以毫米为单位,以毫米为单位)。我需要一个函数,它接受任何给定的十进制值(可能不在列表中)并将其与CHOICES列表中最接近的值匹配,以返回相关的整数。
示例输入可以是8.11
,它会返回0
或7.30
,这会返回1
等。
答案 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 ]
并不重要。