在字典中查找最接近的值

时间:2016-09-15 17:29:35

标签: python python-2.7 loops dictionary iteration

我有一个字典T,其中的密钥格式为k,i,其关联值为实数(浮点数)。我们假设我从字典a,b中选择了具有相应值T的特定键V1 - 这是找到最接近V1值的最有效方法1}}用于具有a+1,i形式的密钥,其中i是一个从0到n的整数? (kab也是整数。)要为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可以是数百万的整数。此外,这个过程会经常重复,因此效率是关键。

3 个答案:

答案 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