Pergunta

Eu lidar com um monte de hierarquias no meu dia a dia desenvolvimento. sistemas de arquivos, nós DAG aninhada em Autodesk Maya, etc.

Eu estou querendo saber, existem módulos boas para Python projetados especificamente para atravessar e comparar as hierarquias de objetos?

De particular interesse seria maneiras de fazer comparações 'difusos' entre dois quase hierarquias idênticos. Algumas das razões para fazer isso seria para combinar duas hierarquias de nó em Maya de dois personagens diferentes, a fim de animação transferência de um para o outro.

Com base no que eu tenho lido, eu provavelmente precisa de algo com um limiar nome (que eu poderia construir-me) para comparar o quão perto dois nomes de nós são uns com os outros. Eu, em seguida, precisa encontrar uma maneira de ignorar opcionalmente a fim de que nós filho aparecem na hierarquia. Por último, eu precisaria para lidar com um limite de profundidade, nos casos em que um nó pode ter sido ligeiramente movido para cima ou para baixo na hierarquia.

Foi útil?

Solução

Eu não tenho certeza que eu vejo a necessidade de um módulo completo -. Hierarquias são um padrão de design, e cada hierarquia tem características únicas suficiente que é difícil generalizar

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

Eu acho que isso é tudo necessidade I. E eu descobri que é difícil fazer um módulo reutilizável fora deste, porque (a) há tão pouco aqui e (b) cada aplicativo adiciona ou muda muito código.

Além disso, acho que a hierarquia mais comumente utilizado é o sistema de arquivos, para o qual eu tenho o módulo os. A hierarquia segundo mais comumente usado é de mensagens XML, para o qual eu tenho ElementTree (geralmente via lxml). Após aqueles dois, eu uso as estruturas acima como modelos para minhas aulas, e não como um módulo reutilizável literal.

Outras dicas

Eu recomendo a cavar em volta xmldifff http://www.logilab.org/859 e ver como eles se comparam os nós e árvores pega paralelas. Ou, tente escrever um gerador [recursiva] que os rendimentos cada [significativas] nó em uma árvore, dizer f(t), em seguida, usar itertools.izip(f(t1),f(t2)) a pares juntos a cobrar de nós para comparação.

A maioria das estruturas hierárquicas I lidar com ter mais de um "eixo", como elementos e atributos em XML, e alguns nós são mais significativos do que outros.

Para uma solução mais bizarro, seriar as duas árvores para arquivos de texto, fazer uma nota referencial essa linha #n vem de nó #x em uma árvore. Faça isso para ambas as árvores, alimentar os arquivos em diff, e digitalizar os resultados notar que partes da árvore foram alterados. Você pode mapear essa #n linha de arquivo 1 (e, portanto, #x nó na primeira árvore) e linha # m de arquivo 2 (e, portanto, #Y nó da segunda árvore) significa que alguma parte de cada árvore é a mesma ou diferente.

Para qualquer solução você está indo ter que estabelecer uma "forma canônica" da sua árvore, que pode cair todos os espaços ignorable, atributos de exibição, nós opcionais, etc., a partir do processo de comparação. Ele também pode significar fazer uma amplitude primeira profundidade vs. primeira travessia da árvore (s).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top