说我在Python {1:'a', 100:'b', 1024:'c'}
我想构建一个函数,不仅可以查找键的确切值,还可以查找近似值。例如,如果输入为99或101,则函数可以返回b
。
你能建议我一些方法吗?
答案 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']