与python dict类似的自动完成功能

时间:2010-06-03 16:15:08

标签: python autocomplete

在PHP中,我有这一行matches = preg_grep('/^for/', array_keys($hash));它会做什么,它会抓住$ hash中的单词:fork,form等。

在Python中,我有一个400,000字的词典。它的关键是我想在自动完成的功能中呈现的词(这种情况下的值毫无意义)。如何从字典中返回与输入匹配的键?

例如(如前所述),如果我有

my_dic = t{"fork" : True, "form" : True, "fold" : True, "fame" : True}

我得到一些输入"for",它会返回"fork""form"的列表。

5 个答案:

答案 0 :(得分:6)

>>> mydict={"fork" : True, "form" : True, "fold" : True, "fame" : True}
>>> [k for k in mydict if k.startswith("for")]
['fork', 'form']

这应该比使用正则表达式更快(如果您只是寻找单词开头,那就足够了。)

答案 1 :(得分:3)

所以这不是你要求的直接答案,但是......

看起来你真的不想要这种类型的词典,你正在寻找一个树状的结构,对吗?

然后,您可以为每个键入的字母(常量时间)遍历树,并从树的该子部分返回叶子作为与该前缀匹配的单词。

答案 2 :(得分:1)

>>> my_dict = {"fork" : True, "form" : True, "fold" : True, "fame" : True}
>>> import re
>>> [s for s in my_dict if re.search('^for', s) is not None]
['fork', 'form']

正则表达式的使用更为通用,因为您可以提供更复杂的搜索模式,如果它只是前缀,您可以使用字符串方法:str.startwith,例如:

>>> [s for s in my_dict if s.startswith('for')]
['fork', 'form']

答案 3 :(得分:1)

如果您想要一个特定的查找策略(例如上面概述的“以3个字符开头”),您可以通过基于该想法创建特定的查找字典来获得快速获胜。

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) ]

希望这比处理整个400,000个密钥要快得多。

答案 4 :(得分:0)

您可以使用my_dict.keys()从my_dict获取密钥。然后,您可以搜索每个键以查看它是否与正则表达式匹配。

m = re.compile('^for')
keys = []
for key in my_dict.keys():
   if m.match(key) != None:
      keys.append(key)