从嵌套字典中检索分支

时间:2013-06-13 06:50:16

标签: python traversal trie

我有一个python嵌套字典(基本上是一个trie结构),句子作为分支 - 每个节点都是一个单词。像这样的东西: enter image description here

从根到提示(句子)检索所有分支的最有效方法是什么?也就是说,我想要所有可能的句子(我有一只狗,我有一把猎枪,我不喜欢猫王)。分支(句子)长度不是固定值。

2 个答案:

答案 0 :(得分:3)

你应该进行深度优先搜索并递归地产生句子的标记。 例如,使用生成器:

def yield_sentences(node):
    if node.is_leaf():
        yield node.word
    else:
        for child in node.children:
            for sentence in yield_sentences(child):
                yield '{} {}'.format(node.word, sentence)

用法:

>>> class Node(object):
...     def __init__(self, word, *children):
...             self.word = word
...             self.children = children
...     def is_leaf(self):
...             return not self.children
... 
>>> tree = Node('I', Node('have', Node('a', Node('dog'), Node('shotgun'))), Node("don't", Node('like', Node('Elvis'))))
>>> #tree is now your example tree
>>> list(yield_sentences(tree))
['I have a dog', 'I have a shotgun', "I don't like Elvis"]

答案 1 :(得分:0)

可能最好的方法是使用memoization进行深度优先搜索,以优化已经解析过的分支。

要做到这一点,最简单的方法是在每个节点中存储预先格式化的所有父节点。例如,节点aI have,节点dog将具有I have a等。

这样,您将能够以O(n)复杂度提取所有分支,其中n是节点数。然而,这需要对结构进行一些修改。

例如

class Node(dict):

    def __init__(self,parent,value,parent_str):
        self.parent      = parent
        self.value       = value
        self.children    = {}
        parent.children[value] = self
        self.parent_str  = parent_str+' '+value

    def __repr__(self):
        return self.parent_str+' '+value

    def addChild(self,value):
        Node(self,value,self.parent_str)