簡體   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