5

私は日々の開発で多くの階層を扱っています。ファイルシステム、AutodeskMayaのネストされたDAGノードなど。

オブジェクトの階層をトラバースして比較するために特別に設計されたPython用の優れたモジュールはありますか?

特に興味深いのは、2つのほぼ同一の階層間で「あいまいな」比較を行う方法です。これを行う理由のいくつかは、アニメーションを一方から他方に転送するために、2つの異なるキャラクターからのMayaの2つのノード階層を一致させるためです。

私が読んでいることに基づいて、2つのノード名が互いにどれだけ近いかを比較するために、名前のしきい値(自分で作成できるもの)を持つものがおそらく必要になるでしょう。次に、子ノードが階層に表示される順序をオプションで無視する方法が必要です。最後に、ノードが階層の上下にわずかに移動した可能性がある場合に備えて、深度のしきい値を処理する必要があります。

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

于 2009-03-20T10:00:05.137 に答える
2

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

私が扱っているほとんどの階層構造には、XML の要素や属性のように複数の「軸」があり、一部のノードは他のノードよりも重要です。

より奇妙な解決策として、2 つのツリーをテキスト ファイルにシリアル化し、行 #n がツリーのノード #x から来ていることを参照メモにします。両方のツリーに対してこれを行い、ファイルを diff にフィードし、結果をスキャンして、ツリーのどの部分が変更されたかを確認します。ファイル 1 の行 #n (したがって、最初のツリーのノード #x) とファイル 2 の行 #m (したがって、2 番目のツリーのノード #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 に答える