2017-09-14 31 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'