我已经阅读过有关LSH散列的内容,并且想知道在1个字符内匹配字符串的最佳实现是什么?
test = {'dog':1, 'cat': 2, 'eagle': 3}
test['dog']
>> 1
如果我查找测试['狗']或测试[' dogg'],我还想返回1。我意识到如果我要查找它也会返回1#log; log"或" cog",但我可以编写一种方法来排除这些结果。
另外,如何通过这个方法让一般字符串在X个字符内返回匹配?
string1 = "brown dogs"
string2 = "brown doggie"
假设我的字典中只存储了string1,则查找string2将返回string1。
由于
答案 0 :(得分:1)
那么,您可以根据共同开始的长度来定义2个字符串之间的相似性(例如,doga
和dogs
为3)。这很简单,但可以满足您的需求。
通过这个假设,您可以定义:
>>> test = {'dog':1, 'cat': 2, 'eagle': 3}
>>> def same_start(s1, s2):
ret = 0
for i in range(min(len(s1), len(s2))):
if s1[i] != s2[i]:
break
ret += 1
return ret
>>> def closest_match(s):
return max(((k, v, same_start(k, s)) for k, v in test.iteritems()), key=lambda x: x[2])[1]
>>> closest_match('dogs') # matches dog
1
>>> closest_match('cogs') # matches cat
2
>>> closest_match('eaogs') # matches eagle
3
>>>
答案 1 :(得分:0)
由于你的关系不是1:1,也许你可以用重新定义的__getitem__
定义你自己的dict类型,它可以返回一个可能的项目列表。这就是我的意思:
class MyDict(dict):
def __getitem__(self, key):
l = []
for k, v in self.items():
if key.startswith(k): # or some other comparation method
l.append(v)
return l
这只是一个想法,可能还应重新定义其他dict方法,以避免可能的错误或无限循环。此外,@Emmanuel's answer在这里非常有用,如果你只需要返回一个项目而不是列表,那么你就不必重新定义所有内容。
答案 2 :(得分:0)
也许您可以尝试使用Soundex函数作为词典键?