[英]Prefix search in a Trie dictionary
我有一个示例字典
{
'A':{
'P':{
'P':{
'L':{
'I':{
'E':{
'S':{
'*':True
}
}
},
'E':{
'S':{
'*':True
},
'*':True
}
}
},
'E':{
'*':True
}
}
}
}
这里{*:True}
表示单词的结尾。 我需要找到我可以从字典中以前缀开头的所有可能的单词。 例如,我可以从上面带有各种前缀的字典中生成的单词如下。
'AP' - > “苹果”、“苹果”、“猿”、“苹果”
'APP' -> "APPLE", "APPLES", "APPLIES"
“苹果”->“苹果”,“苹果”
我基本上是在尝试使用字典实现Trie数据结构并执行前缀搜索。 我想我应该实现一些递归算法来找到所有可能的结果。 我无法弄清楚如何实现它。
我很好奇并想出了这个递归变体:
tree = {
"A": {
"P": {
"P": {
"L": {
"I": {"E": {"S": {"*": True}}},
"E": {"S": {"*": True}, "*": True},
}
},
"E": {"*": True},
}
}
}
def descend(node, prefix=""):
if prefix and prefix[-1] == "*":
print(prefix[:-1])
return
for letter, node in node.items():
descend(node, prefix + letter)
descend(tree)
它打印:
APPLIES
APPLES
APPLE
APE
您可以将递归与生成器一起使用:
data = {'A': {'P': {'P': {'L': {'I': {'E': {'S': {'*': True}}}, 'E': {'S': {'*': True}, '*': True}}}, 'E': {'*': True}}}}
def combos(d, c = []):
for a, b in d.items():
yield from [''.join(c)] if isinstance(b, bool) else combos(b, c+[a])
print(list(combos(data['A']['P'], ['A', 'P'])))
输出:
['APPLIES', 'APPLES', 'APPLE', 'APE']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.