Python用の階層トラバーサルと比較モジュール?
質問
私は一日の開発に私の一日の階層の多くに対処します。ファイルシステム、オートデスクMayaのネストされたDAGノード、など。
私は思ったんだけど、特にオブジェクトの階層を横断し、比較するために設計されたPython用の任意の良いモジュールがあるのですか?
特に興味深いのは、2つののほぼの同じ階層間の「ファジー」の比較を行うための方法だろう。これを行う理由の一部は、一方から他方へアニメーションを転送するために、2つの異なる文字からMayaの2つのノード階層を一致させるためになります。
私が読んでいたものに基づいて、私はおそらく2ノード名がお互いにどれだけ近いかを比較するための名前しきい値で何かを(私は自分自身を構築することができる)必要があると思います。私は、子ノードが階層に表示される順番を無視し、オプションする方法が必要と思います。最後に、私は、ノードが少し上に移動または階層ダウンされている可能性のケースでは、深さのしきい値に対処する必要があると思います。
解決
私は、私は完全なモジュールの必要性を参照してくださいわからない - 階層は、デザインパターンであり、各階層は、それが一般化するのは難しい十分なユニークな機能を備えています。
。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
モジュールを持っているため、ファイルシステム、であることがわかります。二番目に最も一般的に使用される階層は、私が(通常はlxmlの経由)のElementTreeを持っているXMLメッセージを、です。これら二つの後、私は私のクラスのためのテンプレートとしてではなく、文字通りの再利用可能なモジュールとして上記の構造を使用します。
他のヒント
私はxmldifff http://www.logilab.org/859 の周りを掘って、どのように見てお勧めします彼らは、ノードを比較し、並列木を扱います。または、ツリー内の各[重要]ノードを生成する[再帰]ジェネレータを書いてみてください、f(t)
を言って、その後、比較のために一緒にノードのペアを収集するためにitertools.izip(f(t1),f(t2))
を使用します。
私が対処階層構造のほとんどは、XMLの要素と属性のように、一つの「軸」以上のものを持っている、といくつかのノードが他のものよりも重要である。
より多くの奇妙なソリューションについては、ライン#Nは、ツリー内のノード#Xから来ていることを参照メモしておき、テキストファイルに2つのツリーをシリアライズ。 、両方のツリーにそれを行う差分にファイルを送り、そして木の部分が変更された気づか結果をスキャンします。ファイル1からそのライン#Nをマッピングすることができ(及びノード#X最初のツリー内従って)とファイル2(及び第ツリーの、したがってノード#Y)からライン#Mは、各ツリーの一部が同じであることを意味し、または異なるます。
すべてのソリューションについてあなたは、あなたのツリーの「正規の形式」、比較プロセスから、すべての無視できる空白、表示属性、オプションのノードなどをドロップする可能性があるものを確立する必要があるとしています。また、ツリー(S)の深さ優先トラバース対最初の広さをしている意味するかもしれません。
http://code.google.com/p/pytree/する
これら多分やり過ぎか、あなたが必要なもののために、すべてでは適していません。