Python 在字典中查找最接近的值

Python 在字典中查找最接近的值,python,python-2.7,loops,dictionary,iteration,Python,Python 2.7,Loops,Dictionary,Iteration,我有一个字典,T,其键的形式为k,I,其关联值为实数(float)。让我们假设我从字典T中选择一个特定的键a,b,对应值V1——对于形式为a+1,I,其中I是0到n的整数的键,找到与V1最接近的值的最有效方法是什么?(k、a和b也是整数。)要在T中的项目值上添加一个条件,当i在键中增加时,与T[a+1,i]相关的值严格增加(即T[a+1,i+1]>T[a+1,i]) 我计划简单地运行一个while循环,从I=0开始,并将值T[a+1,I]与V1进行比较。更清楚地说,循环将简单地停止在np.abs

我有一个字典,
T
,其键的形式为
k,I
,其关联值为实数(float)。让我们假设我从字典
T
中选择一个特定的键
a,b
,对应值
V1
——对于形式为
a+1,I
,其中
I
是0到n的整数的键,找到与
V1
最接近的值的最有效方法是什么?(
k
a
b
也是整数。)要在
T
中的项目值上添加一个条件,当
i
在键中增加时,与
T[a+1,i]
相关的值严格增加(即
T[a+1,i+1]>T[a+1,i]


我计划简单地运行一个while循环,从
I=0
开始,并将值
T[a+1,I]
V1
进行比较。更清楚地说,循环将简单地停止在
np.abs(T[a+1,i]-V1)
的点,因为我知道与
T[a+1,i]
关联的项最接近
T[a,b]=V1
。但是考虑到我所施加的严格递增条件,有没有比运行while循环迭代字典元素更有效的方法呢
i
将从0变为n,其中n可以是数百万的整数。而且,这个过程会经常重复,所以效率是关键

由于给定的
a
的值随着连续的
i
值严格增加,因此可以对最接近目标的值进行二进制搜索


虽然可以在字典上编写自己的二进制搜索代码,但我怀疑使用不同的数据结构会更容易。如果使用嵌套列表(使用
a
作为外部列表的索引,使用
i
作为内部列表的索引),则可以使用
bisect
模块高效地搜索内部列表。

我建议使用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)
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

形式为k,i的键是否意味着字典是一种二维数组?@Jeon是的,它类似于二维数组(例如,随着i的增加,时间会增加)。选择字典以允许不均匀的间距。虽然其中一个(小)问题是要弄清楚事情是如何简单地根据键来安排的。@moinuddinkadri这不是一个作业。。。这是一个非均匀网格的个人项目。我想找到一个计算空间导数的好方法。我试图找到最接近当前点的值(例如,
V1
)来计算数值微分。我还没有实现一个特定的方法,因为它将被添加到另一个代码中以解决一组PDE。虽然在更改代码之前(如果我知道更好的方法,最后只会再次更改代码),我想我会提前询问是否存在我根本不知道的更有效的技术。在代码中使用字典是出于其他目的的约束,因此很遗憾,另一种数据结构不是一种选择。我将研究现有的二进制搜索代码。谢谢你的建议。我确实找到了一些代码,比如
idx1=np.array(T.keys())
vals1=np.array(T.values())
dims1=idx1.max(0)+1
out1=np.zeros(dims1,dtype=vals1.dtype)
out1[idx1[:,0],idx1[:,1]=vals1
,这可能会有所帮助,但是,每次将dict转换为数组可能会更加低效,因为dict又一次是不均匀的,并且是不断更新的。谢谢您的建议。正如我在上面对另一个答案所评论的那样,为我想做的每一个实例创建一个数组将是低效的,因为使用dict的全部原因是网格是不均匀的,并且不断更新。因此,这里制作的数组必须在我进行比较的每一个实例中进行(也可能是数百万),因为dict将被更新,我怀疑这将是非常低效的。尽管我会尝试和比较。包括numpy完全是过火了