Python的层次结构遍历和比较模块?

时间:2009-03-20 03:37:35

标签: python tree module hierarchy traversal

我在日常开发中处理了很多层次结构。文件系统,Autodesk Maya中的嵌套DAG节点等

我想知道,是否有专门用于遍历和比较对象层次结构的Python的优秀模块?

特别感兴趣的是如何在两个几乎相同的层次结构之间进行“模糊”比较。执行此操作的一些原因是为了将Maya中的两个节点层次结构与两个不同的字符进行匹配,以便将动画从一个转移到另一个。

基于我一直在阅读的内容,我可能需要一些名称阈值(我可以自己构建)来比较两个节点名称彼此之间的距离。然后,我需要一种方法来选择性地忽略子节点在层次结构中出现的顺序。最后,我需要处理深度阈值,以防节点可能在层次结构中稍微向上或向下移动。

3 个答案:

答案 0 :(得分:4)

我不确定是否需要一个完整的模块 - 层次结构是一种设计模式,每个层次结构都有足够的独特功能,很难概括。

class Node( object ):
    def __init__( self, myData, children=None )
        self.myData= myData
        self.children= children if children is not None else []
    def visit( self, aVisitor ):
        aVisitor.at( self )
        aVisitor.down()
        for c in self.children:
            aVisitor.at( c )
        aVisitor.up()

class Visitor( object ):
    def __init__( self ):
        self.depth= 0
    def down( self ):
        self.depth += 1
    def up( self ):
        self.depth -= 1

我发现这就是我所需要的。而且我发现很难用这个来制作一个可重复使用的模块,因为(a)这里的内容很少而且(b)每个应用程序都会添加或更改这么多代码。

此外,我发现最常用的层次结构是文件系统,我有os模块。第二个最常用的层次结构是XML消息,我有ElementTree(通常通过lxml)。在这两个之后,我使用上面的结构作为我的类的模板,而不是作为文字可重用模块。

答案 1 :(得分:2)

我建议在xmldifff http://www.logilab.org/859周围挖掘,看看他们如何比较节点和处理并行树。或者,尝试编写[递归]生成器,生成树中的每个[重要]节点,比如f(t),然后使用itertools.izip(f(t1),f(t2))收集节点对进行比较。

我处理的大多数层次结构都有多个“轴”,比如XML中的元素和属性,有些节点比其他节点更重要。

对于一个更奇怪的解决方案,将两个树序列化为文本文件,做一个参考注释,行#n来自树中的节点#x。对两棵树执行此操作,将文件提供给diff,并扫描结果以注意树的哪些部分已更改。您可以映射文件1中的行#n(因此第一个树中的节点#x)和文件2中的行#m(因此第二个树的节点#y)表示每个树的某些部分是相同的或不同。

对于任何解决方案,您将不得不建立树的“规范形式”,可能会从比较过程中删除所有可忽略的空白,显示属性,可选节点等。它也可能意味着首先进行广度优先与树的深度优先遍历。

答案 2 :(得分:1)

http://code.google.com/p/pytree/

这些可能是矫枉过正或根本不适合你需要的东西:

http://networkx.lanl.gov/

http://www.osl.iu.edu/~dgregor/bgl-python/