Python 查找最近的十进制匹配

0 投票
3 回答
1712 浏览
提问于 2025-04-16 14:34

我有一个这样的列表:

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))

撰写回答