Python 查找最近的十进制匹配
我有一个这样的列表:
CHOICES = (
('8.25', '0'),
('7.35', '1'),
[...]
)
我使用的模型会把元组中的第一个值存储起来(比如说8.25 - 顺便提一下,这个值是毫米)。我需要一个函数,它可以接受任何给定的小数值(可能不在列表中),然后找到与CHOICES列表中最接近的值,并返回相应的整数。
举个例子,输入可能是8.11
,那么它会返回0
;或者输入7.30
,它会返回1
等等。
3 个回答
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 ]
不过这也没什么大不了的。
2
你可以查看这个链接,里面有关于Python中一个叫做“bisect”的库的详细说明:http://docs.python.org/library/bisect.html
建议你看看最后面的例子,这样会更容易理解。
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))