2013-02-13 41 views
0

我已阅读关于LSH哈希,并想知道在1个字符内匹配字符串的最佳实现是什么?如何在Python中对字符串进行哈希以匹配1个字符?

test = {'dog':1, 'cat': 2, 'eagle': 3} 

test['dog'] 
>> 1 

我想要返回1,如果我查找测试['狗']或测试['狗']。我意识到,如果我要查找“日志”或“齿轮”,它也会返回1,但我可以编写一个方法来排除这些结果。

另外我怎样才能进一步此方法为一般字符串返回X字符内的匹配?

string1 = "brown dogs" 
string2 = "brown doggie" 

假设只有string1存储在我的字典中,查找string2将返回string1。

感谢

+0

总之,你不能。哈希表是错误的工具。 – delnan 2013-02-13 15:32:07

+0

这是行不通的,因为你描述的不是[等价关系](http://en.wikipedia.org/wiki/Equivalence_relation)。 – SLaks 2013-02-13 15:32:15

+0

那么你是否想要得到与给定键最相似的键的值?那是对的吗? – freakish 2013-02-13 15:41:31

回答

1

那么,你可以通过他们共享开始的长度定义两个字符串之间的相似性(3 dogadogs,例如)。这很简单,但这可以满足您的需求。因为你的关系不是1

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

在这个假设下,你可以定义这个1,也许你可以定义与重新定义__getitem__自己的字典类型可能会返回可能的项目清单。这就是我的意思是:

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 

这只是一个想法,可能是其他字典的方法应该是为了避免可能出现的错误或无限循环也重新定义。另外,如果您只想返回一个项目而不是列表,那么@Emmanuel's answer在这里可能非常有用,这样您就不必重新定义所有内容。

0

也许你可以尝试使用Soundex函数作为你的字典键?