所以基本上我有一个带有一些值的字典,我想找到与给定值最接近的值。所以它看起来像这样:
values = {"val": [210418, 211120, 211822, 212523, 213500]}
input = 210944
output = find_nearest(input,values["val"])
print output
# 210418
正如您所看到的,我希望得到最接近我的价值的值。 min()方法给了我211120,但我想获得210418.我怎么能这样做?
答案 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 - x
。 input - x
为负数的值可以通过让其键值为input
来忽略,根据定义,该值大于input - x
。只有
output = min(values['val'], key=lambda x: input - x if x < input else input)
如果没有值小于input
,min
会在生成的空序列上引发ValueError
。我把它作为练习让读者决定如何处理它。