5

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

我想知道,有没有专门设计用于遍历和比较对象层次结构的 Python 模块?

特别感兴趣的是在两个几乎相同的层次结构之间进行“模糊”比较的方法。这样做的一些原因是为了在 Maya 中匹配来自两个不同角色的两个节点层次结构,以便将动画从一个角色转移到另一个角色。

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

4

3 回答 3

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)。在这两个之后,我将上述结构用作我的类的模板,而不是作为文字可重用模块。

于 2009-03-20T10:00:05.137 回答
2

我建议挖掘 xmldifff http://www.logilab.org/859并查看它们如何比较节点和处理并行树。或者,尝试编写一个 [recursive] 生成器,生成树中的每个 [significant] 节点,例如f(t),然后用于itertools.izip(f(t1),f(t2))将节点对收集在一起进行比较。

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

对于更奇怪的解决方案,将两棵树序列化为文本文件,请注意 #n 行来自树中的节点 #x。对两棵树都这样做,将文件输入 diff,然后扫描结果以注意树的哪些部分发生了变化。您可以映射文件 1 中的 #n 行(因此第一棵树中的节点 #x)和文件 2 中的 #m 行(因此第二棵树的节点 #y)意味着每棵树的某些部分是相同的或不同的。

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

于 2009-03-22T03:06:05.117 回答
1

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

这些可能会矫枉过正或根本不适合您的需要:

http://networkx.lanl.gov/

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

于 2009-03-20T03:53:27.640 回答