层次遍历和比较模块为Python?
题
我应对我每一天的发展有很多层次的。文件系统,在Autodesk Maya中嵌套DAG节点,等等。
我想知道,是否有任何模块好为Python专门设计来遍历和比较对象的层次?
特别令人感兴趣的是如何做两件的近的相同层次之间的“模糊”的比较。一些原因这样做将是在为了从一个传送动画到另一个从两个不同的字符匹配在Maya两个节点的层次结构。
基于我一直在读什么,我可能需要使用一个名称门槛的东西(我可以自己建)用于比较两个节点的名字有多接近对方。那么我需要一种方法来选择忽略的子节点出现在层次结构中的顺序。最后,我需要处理的深度阈值时,在一个节点可能已经略微向上或向下移动层次的情况。
解决方案
我不知道我看到需要一个完整的模块 - 层次是一个设计模式,每个层次都有足够独特的功能,很难一概而论。
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
我觉得这是我所需要的。而且我发现,这是很难做出一个可重用模块出这一点,因为(一)有这么少在这里和(b)每个应用程序添加或更改了这么多的代码。
此外,我发现,最常用的层次结构是文件系统,为此,我有os
模块。第二个最常用的层次是XML消息,我有ElementTree的(通常是通过LXML)。这两个后,我使用上面的结构作为用于我的类,而不是作为一个字面可重用模块的模板。
其他提示
我建议周围挖掘xmldifff http://www.logilab.org/859 和看如何他们比较节点和处理并行的树木。或者,尝试写[递归]发生器产生每个[显著]节点在树中,说f(t)
,然后使用itertools.izip(f(t1),f(t2))
收集节点对一起进行比较。
大多数分层结构I处理有一个以上的“轴”,相同的元件,在XML属性,某些节点比其他人更显著。的
有关更离奇的解决方案,序列化两棵树到文本文件,做一个参考。注意,线#N来自节点#X在一棵树上。这样做既树木,将文件送入差异,以及扫描结果注意到该树的部分已经改变。可以映射从文件1该行#N(并且因此节点#x中在第一树)和从文件2(因此第二树的节点#Y)线#m中意味着每个树的某些部分是相同的或不同。
有关的任何溶液您将不得不建立您的树中,一个可能丢弃所有可忽略空白,显示属性,可选节点等的“规范形式”,从比较处理。它也可能意味着首先进行广度与树(S)的深度优先遍历。
http://code.google.com/p/pytree/
这或许矫枉过正,或不适合在所有你所需要的: