我有一个字典T
,其中的密钥格式为k,i
,其关联值为实数(浮点数)。我们假设我从字典a,b
中选择了具有相应值T
的特定键V1
- 这是找到最接近V1
值的最有效方法1}}用于具有a+1,i
形式的密钥,其中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可以是数百万的整数。此外,这个过程会经常重复,因此效率是关键。
答案 0 :(得分:0)
由于给定a
的值严格增加连续的i
值,因此您可以对距离目标最近的值进行二进制搜索。
虽然您可以在字典上编写自己的二进制搜索代码,但我怀疑您可以更轻松地使用不同的数据结构。如果您使用嵌套列表(a
作为外部列表的索引,i
作为内部列表的索引),则可以使用bisect
模块搜索内部列表有效。
答案 1 :(得分:0)
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)
答案 2 :(得分:0)
我建议使用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