Python字典模糊键搜索

时间:2016-04-05 20:54:57

标签: python dictionary search

我想知道我是否可以在python词典中进行“模糊”的键搜索。例如,我有一个这样的字典:

data = { "Google.com" : value1, "StackOverFlow": value2, ....}

如果我有一个字符串

name= "Google" or name = "google" or even name = "gooogle"

我想在我的字典中访问value1(其键是“Google.com”),我该怎么做?我知道我可以遍历键列表并进行一些字符串处理,但如果我有多个名字,我想做这样模糊的搜索,它会是O(n ^ 2)对吗?有没有有效的方法呢?假设数据字典非常大。

希望我的问题很明确......

2 个答案:

答案 0 :(得分:5)

如果你想做一些模糊搜索,那么你将有效地提出自己的哈希算法。或者创建自己的字典变体,然后覆盖.__getitem__和相关方法。

以下是一个例子:

from jellyfish import soundex

data = {soundex('google'): 'google.com', soundex('stackoverflow'): 'stackoverflow.com'}
print(data[soundex('gooooogle')])
# Should print `google.com`, because soundex pretty much ignores vowels

或替代方案:

from jellyfish import soundex

class SoundexDict(dict):
    # __init__ and __repr__ is left as an exercise for the reader
    def __getitem__(self, key):
        return super().__getitem__(soundex(key))

    def __setitem__(self, key, value):
        super().__setitem__(soundex(key), value)

mydict = SoundexDict()
mydict['google'] = 'google.com'
print(mydict['gewgle'])  # prints 'google.com'

答案 1 :(得分:0)

搜索时没有高效的模糊密钥。 Python的dict使用哈希来查找字典中的位置,并且哈希对于类似的字符串来说是非常不同的。我们来看看:

assert hash("Google.com") == 4399753695393964520
assert hash("Google.co") == -9213236188503134626

至少在我的操作系统中。

结论:你很少会接近"使用类似的键来获得所需的值。

所以:不。你不能使用dicts来避免O(n ^ 2)。