如何在Python中创建带噪声的查找表?

时间:2017-09-14 12:56:24

标签: python lookup-tables

说我在Python {1:'a', 100:'b', 1024:'c'}

中有一本字典

我想构建一个函数,不仅可以查找键的确切值,还可以查找近似值。例如,如果输入为99或101,则函数可以返回b

你能建议我一些方法吗?

4 个答案:

答案 0 :(得分:2)

如果您希望保持>>> 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'} 的速度优势,可以将密钥绑定,例如通过将它们舍入到最接近的10的倍数:

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' 中的某个键时,您只需应用相同的转换:

items

答案 1 :(得分: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

答案 2 :(得分: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'})

答案 3 :(得分: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']