我有一套约{650}字的all_words
。如何使用Python快速生成以给定字符串开头的单词列表?
显然,我可以做类似
的事情def completions(word_start):
ell = len(word_start)
return [w for w in all_words if w[: ell] == word_start]
这可行,但需要一秒钟。什么是生成完整列表的更快方法?
答案 0 :(得分:2)
快速的方法是按照第一个n
字符进行预索引:
words_by_first3 = {}
for word in word_set:
first3 = word[:3]
if first3 not in words_by_first3:
words_by_first3[first3] = set()
words_by_first3[first3].add(word)
然后用它来查找完成次数:
def completions(word):
ell = len(word)
return set(w for w in words_by_first3[word[:3]] if w[: ell] == word)
在我的情况下,这会很快给出结果,但它会占用大量内存。
答案 1 :(得分:2)
我认为这类问题的最快和最节省空间的数据结构是使用prefix tree。在将您的单词集合解析到树中之后,查找时间应该非常快。那里甚至似乎有一个python implementation。
答案 2 :(得分:1)
您可以使用Python生成器(https://wiki.python.org/moin/Generators)。
在开始使用之前,您不必生成所有单词。假设您有一个按字典顺序排序的列表,您可以获取最初的几个结果并开始使用它们。并根据需要获得更多结果'。
答案 3 :(得分:0)
您可能想签出我开源的图书馆:https://github.com/seperman/fast-autocomplete
它非常易于使用:
>>> from fast_autocomplete import AutoComplete
>>> words = {'book': {}, 'burrito': {}, 'pizza': {}, 'pasta':{}}
>>> autocomplete = AutoComplete(words=words)
>>> autocomplete.search(word='b', max_cost=3, size=3)
[['book'], ['burrito']]
>>> autocomplete.search(word='bu', max_cost=3, size=3)
[['burrito']]
>>> autocomplete.search(word='barrito', max_cost=3, size=3) # mis-spelling
[['burrito']]
答案 4 :(得分:0)
如果数据集相对较小,则蛮力线性搜索不会太差。但是,对于大型数据集(如本例所示),您将很快遇到内存和速度限制。
正如其他答案所提到的,用于此目的的最佳数据结构是Trie,它将使您高效地进行前缀搜索。
但是,很难在纯Python中实现内存高效的特里(特别是如果您想支持更新)。如果您不介意使用通过Python客户端访问的外部进程,则可以使用Typesense:https://github.com/typesense/typesense