使用python dict的类似自动完成的功能
在PHP中,我有一行使用python dict的类似自动完成的功能,python,autocomplete,Python,Autocomplete,在PHP中,我有一行matches=preg_grep(“/^for/”,array_keys($hash))它会做的是抓取$hash中的单词:fork、form等 在Python中,我有一个40万字的dict。它的键是我想在自动完成功能中呈现的单词(本例中的值没有意义)。如何从字典中返回与输入匹配的键 例如(如前所述),如果我 my_dic = t{"fork" : True, "form" : True, "fold" : True, "fame" : True} 我为“”得到一些输入,它
matches=preg_grep(“/^for/”,array_keys($hash))代码>它会做的是抓取$hash中的单词:fork、form等
在Python中,我有一个40万字的dict。它的键是我想在自动完成功能中呈现的单词(本例中的值没有意义)。如何从字典中返回与输入匹配的键
例如(如前所述),如果我
my_dic = t{"fork" : True, "form" : True, "fold" : True, "fame" : True}
我为“
”得到一些输入,它将返回一个列表,其中包含“fork”
,“form”
正则表达式的使用更加普遍,因为您可以提供更复杂的搜索模式,如果只是关于前缀,您可以使用字符串方法:,例如:
>>> [s for s in my_dict if s.startswith('for')]
['fork', 'form']
这应该比使用正则表达式更快(如果只是查找单词的开头就足够了)。您可以使用my_dict.keys()从my_dict获取密钥。然后,您可以搜索每个键,查看它是否与正则表达式匹配
m = re.compile('^for')
keys = []
for key in my_dict.keys():
if m.match(key) != None:
keys.append(key)
所以这不是对你所问问题的直接回答,但是 看起来你并不真的想要一个dict来做这类事情,你在寻找一个树状结构,对吗
然后,您可以为键入的每个字母遍历树(固定时间),并将树的该部分中的叶子作为与前缀匹配的单词返回。如果您需要特定的查找策略(如上面概述的“startswith3chars”),基于这个想法创建一个特定的查找词典可能会很快获得成功
q = {"fork":1, "form":2, "fold":3, "fame":4}
from collections import defaultdict
q1 = defaultdict(dict)
for k,v in q.items():
q1[k[:3]][k]=v
这将允许您在更小的集合上执行.startswith
类型查找
def getChoices(frag):
d = q1.get(frag[:3])
if d is None:
return []
return [ k for k in d.keys() if k.startswith(frag) ]
希望这比处理整个400000个键要快得多。这个特殊情况不是我唯一一次使用dict。它是一个反向索引,因此值是一组文档ID,对我所做的工作绝对重要。我之所以使用dict,是因为查找速度比树快得多(内存充足,CPU周期不够),尽管dict的已知键查找速度比树结构快,但不必测试每个键的部分匹配情况——因此在您事先不知道键的情况下(如上面所述)更像树的东西会更好。仅供参考,解决此问题的完美数据结构称为trie,但python的stdlib没有。对于SilentGhost,
“fold”
“fold”不会有太多的:您完全正确,经过编辑。
q = {"fork":1, "form":2, "fold":3, "fame":4}
from collections import defaultdict
q1 = defaultdict(dict)
for k,v in q.items():
q1[k[:3]][k]=v
def getChoices(frag):
d = q1.get(frag[:3])
if d is None:
return []
return [ k for k in d.keys() if k.startswith(frag) ]