[英]Finding closest value in a dictionary
我有一個字典, T
,鍵形式為k,i
的關聯值為實數(浮點數)。 假設我從字典T
選擇一個具有相應值V1
的特定鍵a,b
,對於形式為a+1,i
的鍵,找到最接近V1
值是最有效的方法,其中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可以是數百萬的整數。 此外,這個過程會經常重復,因此效率是關鍵。
由於給定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.