如何在python中散列字符串以匹配1个字符?

时间:2013-02-13 15:29:38

标签: python string search hash

我已经阅读过有关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。

由于

3 个答案:

答案 0 :(得分:1)

那么,您可以根据共同开始的长度来定义2个字符串之间的相似性(例如,dogadogs为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函数作为词典键?