在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"
的列表。
答案 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)