2017-09-14 74 views
0

說我有一本Python字典{1:'a', 100:'b', 1024:'c'}如何在Python中使用噪聲創建查找表?

我想要構建一個函數,它不僅可以查找該鍵的確切值,還可以查找近似值。例如,如果輸入爲99或101,該函數可以返回b

您能否給我建議一些方法?

+0

https://開頭pypi.python.org/pypi/fuzzydict/0.0.1 –

+0

好的解決方案通常取決於您的具體問題。如果fuzzdict不滿足你可以給你更具體的細節?例如。類似的東西通常用於字符串(模糊搜索)或圖片(接近重複檢測)。 – syntonym

+0

嗨,我會看看fuzzydict –

回答

1

如果你有一個有限的範圍是預先已知的東西像這樣的索引與元組

>>> d={(0,2):'a', (99,101):'b', (1023,1025):'c'} 

該鍵的值要查找鍵的值:

查找1024.01:

>>> d={(0,2):'a', (99,101):'b', (1023,1025):'c'} 
>>> next(v for (k,v) in d.iteritems() if k[0]<=1024.01<=k[1]) 
'c' 

查找1025.01

>>> next(v for (k,v) in d.iteritems() if k[0]<=1025.01<=k[1]) 
# throws an error because key is not found 
+0

謝謝。如果數字是浮點數,而不是整數,你的解決方案如何工作? –

+0

@TiếuThủy好點!我更新了答案 – user2314737

1

你可以使自己的查找功能如下:

import sys 

def lookup(value, dict): 
    nearest = sys.maxint 
    result = "" 

    for k,v in dict.iteritems(): 
    if abs(value - k) < nearest: 
     nearest = abs(value - k) 
     result = v 

    return result 

print lookup(101, {1:'a', 100:'b', 1024:'c'}) 
1

你可以用這樣的2%範圍內(可配置)內的值進行搜索:

data = {1:'a', 100:'b', 1024:'c'} 

def get_approx(data, key): 
    return [elem[1] for elem in data.iteritems() if elem[0]*0.98 <= key <= elem[0]*1.02] 

get_approx(data, 99) # outputs ['b'] 
2

如果你想保留速度優勢的dict,你可以把你的鑰匙,例如他們四捨五入到10的最近倍數:

>>> data = {1:'a', 100:'b', 1024:'c'} 
>>> fuzzy = { ((k + 5) // 10) * 10:v for k,v in data.items() } 
>>> fuzzy 
{0: 'a', 100: 'b', 1020: 'c'} 

當您想檢查一個值是接近data一個鍵,就簡單地套用相同的變換:

>>> fuzzy.get(((98+5)//10)*10) 
'b' 
>>> fuzzy.get(((97+5)//10)*10) 
'b' 
>>> fuzzy.get(((100+5)//10)*10) 
'b' 
>>> fuzzy.get(((101+5)//10)*10) 
'b' 
>>> fuzzy.get(((1022+5)//10)*10) 
'c'