在字典中找到最接近的值

时间:2017-12-01 17:15:50

标签: python arrays python-2.7 dictionary

所以基本上我有一个带有一些值的字典,我想找到与给定值最接近的值。所以它看起来像这样:

values = {"val": [210418, 211120, 211822, 212523, 213500]}
input = 210944
output = find_nearest(input,values["val"])
print output
# 210418

正如您所看到的,我希望得到最接近我的价值的值。 min()方法给了我211120,但我想获得210418.我怎么能这样做?

5 个答案:

答案 0 :(得分:2)

如果你的值是有序的,就像在示例数据中一样,这可以在对数时间内使用二分法:

>>> vals = [210418, 211120, 211822, 212523, 213500]
>>> target = 210944
>>> from bisect import bisect_left
>>> i = bisect_left(vals, target)
>>> if i == 0:
...     raise Exception
... 
>>> vals[i-1]
210418

如果没有订购,请考虑numpy:

>>> import numpy as np
>>> a = np.array(vals)
>>> a[a<target].max()
210418

答案 1 :(得分:1)

使用abs(a - b)作为两个值之间的绝对差值(距离),并将其作为lambda传递给key min函数的参数。

  def find_nearest(val, arr):
        return min(arr, key=lambda a: abs(val - a))

答案 2 :(得分:1)

这是您的解决方案。这在O(n)时间内运行。

In [20]: values = {"val": [210418, 211120, 211822, 212523, 213500]}
    ...:

In [21]: list_val = values['val']

In [22]: def nearest_val(val):
    ...:     nearest = list_val[0]
    ...:     for v in list_val[1:]:
    ...:         if v == val:
    ...:             nearest = val
    ...:             break
    ...:         if v-val > 0 and v-val < nearest-val:
    ...:             nearest = v
    ...:     return nearest
    ...:

In [23]: nearest_val(210944)
Out[23]: 210418

首先对“val”列表进行排序,然后遍历排序列表并继续检查是否找到了一个小于最近计算值的值。

答案 3 :(得分:1)

你可以试试这个:

values = {"val": [210418, 211120, 211822, 212523, 213500]}
input = 210944
final_value = [i for i in sorted(values['val'], key=lambda x:abs(x-input)) if i < input][0]

输出:

210418

答案 4 :(得分:0)

您希望最小化差异x的值input - xinput - x为负数的值可以通过让其键值为input来忽略,根据定义,该值大于input - x。只有

output = min(values['val'], key=lambda x: input - x if x < input else input)

如果没有值小于inputmin会在生成的空序列上引发ValueError。我把它作为练习让读者决定如何处理它。