也许您正在寻找类似以下内容的东西:
def match_prefix(pfx,seq):
'''return subset of seq that starts with pfx'''
results = list()
for i in seq:
if i.startswith(pfx):
results.append(i)
return results
def extract_prefixes(lngth,seq):
'''return all prefixes in seq of the length specified'''
results = dict()
lngth += 1
for i in seq:
if i[0:lngth] not in results:
results[i[0:lngth]] = True
return sorted(results.keys())
def gen_prefix_indexed_list(depth,seq):
'''return a dictionary of all words matching each prefix
up to depth keyed on these prefixes'''
results = dict()
for each in range(depth):
for prefix in extract_prefixes(each, seq):
results[prefix] = match_prefix(prefix, seq)
return results
if __name__ == '__main__':
words='''Apple Ape Arc Abraid Bridge Braide Bray Boolean'''.split()
test = gen_prefix_indexed_list(2, words)
for each in sorted(test.keys()):
print "%s:\t\t" % each,
print ' '.join(test[each])
这篇文章讲述了如何生成在一个单词列表中出现过的所有前缀,并且您可以指定一个数字(在此示例中为2)。然后您需要生成与每个这些前缀匹配的所有单词的索引。
我相信有更优雅的方法来实现这个功能。但是,为了快速且易于解释的方法,我只建议从显而易见的需求规格分解开始构建。如果最终结果值是给定前缀所匹配的列表,则我们首先应从输入中筛选出这些匹配的函数。如果最终结果键都是在输入中出现的1到N个前缀,则我们具有提取它们的函数。因此,我们的规格非常简单,围绕着这一点形成一个嵌套循环。
当然,这个嵌套循环可能会存在问题。通常情况下,这样的循环效率相对较低。如本程序所示,将重复C * N * N次原始列表(C是代表长度为1、2等的前缀的常数;而N是列表的长度)。
如果此分解提供了所需的语义,则可以考虑提高效率。明显的方法是在遍历列表时惰性生成字典键...对于每个单词,对于每个前缀长度,生成键...将该单词附加到存储在该键处的列表/值中...然后继续下一个单词。
仍然有一个嵌套循环,但这是每个关键字/前缀长度的短循环。该替代设计的优点在于,我们可以遍历来自任何可迭代对象的单词列表,而不仅仅是内存中的列表。因此,我们可以遍历文件的行、从数据库查询生成的结果等---而不会出现保留整个原始单词列表所需的内存开销的问题。
当然,我们仍然将字典存储在内存中。但是我们也可以改变它,将逻辑与输入和存储分离。当我们将每个输入附加到各种前缀/键值时,我们不关心它们是否是字典中的列表、文件集合中的行,还是从DBM或其他键/值存储中提取并推回的值(例如某些类型的CouchDB或其他“noSQL clustered/database”)。
实现留给读者作为练习。