繁体   English   中英

在字典中查找最接近的值

[英]Finding closest value in a dictionary

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

由于给定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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM