[英]Finding closest value in a dictionary
我有一个字典, T
,键形式为k,i
的关联值为实数(浮点数)。 假设我从字典T
选择一个具有相应值V1
的特定键a,b
,对于形式为a+1,i
的键,找到最接近V1
值是最有效的方法,其中i
是一个整数范围从0到n? ( k
, a
和b
也是整数。)为了在T
的项的值上添加一个条件,随着密钥中的i
增加,与T[a+1,i]
相关联的值严格增加(即T[a+1,i+1] > T[a+1,i]
)。
我打算简单地运行一个从i = 0
开始的while循环,并将值T[a+1,i]
与V1
。 更清楚的是,循环将简单地停在np.abs(T[a+1,i] - V1) < np.abs(T[a+1,i+1] - V1)
,如我知道与T[a+1,i]
相关的项目最接近T[a,b] = V1
。 但是考虑到我强加的严格条件,是否有一种比运行迭代字典元素的while循环更有效的方法? i
将从0到n,其中n可以是数百万的整数。 此外,这个过程会经常重复,因此效率是关键。
由于给定a
的值随着连续的i
值严格增加,因此您可以对最接近目标的值进行二进制搜索。
虽然您可以在字典上编写自己的二进制搜索代码,但我怀疑您可以更轻松地使用不同的数据结构。 如果您使用嵌套列表(其中a
作为外部列表的索引,而i
作为内部列表的索引),则可以使用bisect
模块有效地搜索内部列表。
import numpy as np
target_value = 0.9
dict = {(1, 2): 0, (4, 3): 1}
k = list(dict.keys())
v = np.array(list(dict.values()))
dist = abs(v - target_value)
arg = np.argmin(dist)
answer = k[arg]
print(answer)
我建议使用bisect模块。
import bisect
import numpy as np
t = np.array([[1.1, 2.0, 3.7],
[3.5, 5.6, 7.8],
[2.5, 3.4, 10.0]])
def find_closest(t, a, i):
"""
>>> find_closest(t, 0, 2)
(1, 0)
"""
v = t[a, i]
b_index = bisect.bisect_right(t[a + 1], v)
try:
if t[a + 1][b_index] - v > t[a + 1][b_index - 1] - v:
b_index -= 1
except IndexError:
pass
return a + 1, b_index
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.