Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python dict的类似自动完成的功能_Python_Autocomplete - Fatal编程技术网

使用python dict的类似自动完成的功能

使用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} 我为“”得到一些输入,它

在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}
我为“
”得到一些输入,它将返回一个列表,其中包含
“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) ]