【问题标题】:Retrieving branches from a nested dictionary从嵌套字典中检索分支
【发布时间】:2013-06-13 06:50:16
【问题描述】:

我有一个带有句子作为分支的 Python 嵌套字典(基本上是一个 trie 结构)——每个节点都是一个单词。像这样的东西:

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

【问题讨论】:

    标签: python traversal trie


    【解决方案1】:

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

    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"]
    

    【讨论】:

      【解决方案2】:

      可能最好的方法是使用记忆来优化已经解析的分支的深度优先搜索。

      为此,最简单的方法是在每个节点中存储预先格式化的所有父节点。例如,节点a 将具有I 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)
      

      【讨论】:

        猜你喜欢
        • 2020-10-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-29
        • 2020-07-13
        • 2019-09-06
        • 1970-01-01
        • 1970-01-01
        • 2018-09-27
        相关资源
        最近更新 更多