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

如何在Python中创建带有噪波的查找表?,python,lookup-tables,Python,Lookup Tables,假设我有一本Python词典{1:'a',100:'b',1024:'c'} 我想构建一个函数,它不仅可以查找键的精确值,还可以查找近似值。例如,如果输入为99或101,函数可以返回b 你能给我推荐一些方法吗?如果你有一个预先知道的键值的有限范围,比如元组索引 >>> d={(0,2):'a', (99,101):'b', (1023,1025):'c'} 要查找键的值,请执行以下操作: 查找1024.01: >>> d={(0,2):'a', (99,10

假设我有一本Python词典
{1:'a',100:'b',1024:'c'}

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


你能给我推荐一些方法吗?

如果你有一个预先知道的键值的有限范围,比如元组索引

>>> 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'

如果预先知道键的值有一个有限的范围,比如元组索引

>>> 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'

您可以按如下方式创建自己的查找功能:

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'})
导入系统 def查找(值、dict): 最近值=sys.maxint result=“” 对于dict.iteritems()中的k,v: 如果abs(值-k)<最近值: 最近值=绝对值(值-k) 结果=v 返回结果 打印查找(101,{1:'a',100:'b',1024:'c'})
您可以按如下方式创建自己的查找功能:

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'})
导入系统 def查找(值、dict): 最近值=sys.maxint result=“” 对于dict.iteritems()中的k,v: 如果abs(值-k)<最近值: 最近值=绝对值(值-k) 结果=v 返回结果 打印查找(101,{1:'a',100:'b',1024:'c'})
您可以使用以下方法搜索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']
data={1:'a',100:'b',1024:'c'}
def get_近似值(数据、钥匙):

返回[elem[1]表示数据中的元素。iteritems()如果elem[0]*0.98您可以使用以下内容搜索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']
data={1:'a',100:'b',1024:'c'}
def get_近似值(数据、钥匙):

返回[elem[1]表示数据中的元素。iteritems()如果elem[0]*0.98如果您想保持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'}
当您想检查某个值是否接近
数据中的某个键时,只需应用相同的转换:

>>> 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'

如果您想保持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'}
当您想检查某个值是否接近
数据中的某个键时,只需应用相同的转换:

>>> 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'

好的解决方案通常取决于您的具体问题。如果fuzzdict不能满足您的要求,您可以提供更多具体的细节吗?例如,类似的内容通常用于字符串(模糊搜索)或图片(接近重复检测)。您好,我将期待fuzzydict@Tiế乌斯ủy定义“近似值”。好的解决方案通常取决于您的具体问题。如果fuzzdict不满足您的要求,您可以提供更具体的细节吗?例如,类似的内容通常用于字符串(模糊搜索)或图片(接近重复检测)。您好,我将fuzzydict@Tiế乌斯ủy定义“近似值”。谢谢。如果数字是浮点数,而不是整数,你的解决方案如何工作?谢谢。如果数字是浮点数,而不是整数,你的解决方案如何工作?