2009-03-20 9 views
5

私は日々の開発において多くの階層を扱います。ファイルシステム、Autodesk MayaのネストされたDAGノードなどPythonの階層トラバーサルと比較モジュール?

オブジェクトの階層をトラバースして比較するためにPythonに適したモジュールはありますか?

特に興味があるのは、2つの,の同じ階層間の「ファジィ」比較を行う方法です。これを行う理由のいくつかは、アニメーションを一方から他方に移すために、2つの異なる文字からMayaの2つのノード階層を一致させるためのものです。

私が読んできたことに基づいて、おそらく2つのノード名がどれほど近いかを比較するための名前しきい値(自分で構築することができる)が必要です。子ノードが階層内に現れる順序をオプションで無視する方法が必要です。最後に、ノードがわずかに階層の上または下に移動した可能性がある場合には、深さのしきい値に対処する必要があります。

答えて

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モジュールがあることがわかりました。 2番目によく使われる階層は、ElementTree(通常はlxml経由)を持つXMLメッセージです。これらの2つの後、私はリテラルな再利用可能なモジュールではなく、クラスのテンプレートとして上記の構造を使用します。

+0

非常に真です。私は誰かがファジィ階層比較とマッチングを行うためのいくつかの一般的なツールを持っていることを期待していました。 – Soviut

+0

この文脈では、「ファジー」とは何を意味しますか?追加の事実であなたの質問を更新してください。 –

+0

私は私の質問を明確にしました。 – Soviut

2

xmldifff http://www.logilab.org/859を掘り下げ、ノードの比較と並行したツリーの処理を確認することをお勧めします。あるいは、ツリー内に各[重要]ノードを生成する[再帰的な]ジェネレータを作成してみてください。f(t)とし、itertools.izip(f(t1),f(t2))を使って比較のためにノードのペアをまとめてください。

私が扱う階層構造のほとんどは、XMLの要素や属性のように複数の「軸」を持ち、いくつかのノードは他のものより重要です。

もっと奇妙な解決策を得るには、2つのツリーをテキストファイルにシリアル化し、行#nがツリーのノード#xから来るという参照ノートを作成します。両方のツリーにそれを行い、diffにファイルを送り、ツリーのどの部分が変更されたかを知るために結果をスキャンします。その行#nをファイル1(したがって、最初のツリーのノード#x)とファイル#2の行#m(したがって2番目のツリーのノード#y)とにマップすると、各ツリーの一部が同じか、異なる。

あなたのツリーの "正式な形式"を確立する必要があります.1つは、比較プロセスから無視できる空白、表示属性、オプションのノードなどをすべて削除する可能性のあるものです。それはまた、ツリーの最初の横切りに対する深さの最初の横断を行うことを意味してもよい。