我想知道我是否可以在python词典中进行“模糊”的键搜索。例如,我有一个这样的字典:
data = { "Google.com" : value1, "StackOverFlow": value2, ....}
如果我有一个字符串
name= "Google" or name = "google" or even name = "gooogle"
我想在我的字典中访问value1(其键是“Google.com”),我该怎么做?我知道我可以遍历键列表并进行一些字符串处理,但如果我有多个名字,我想做这样模糊的搜索,它会是O(n ^ 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)。