2009-03-20 3 views
5

저는 하루 하루 발전하는 많은 계층 구조를 다루고 있습니다. Autodesk Maya의 파일 시스템, 중첩 된 DAG 노드 등Python을위한 계층 탐색 및 비교 모듈?

궁극적으로 트래버스하고 객체의 계층 구조를 비교하도록 설계된 Python 용 모듈이 있습니까?

특히 흥미로운 점은 두 개 사이의 '퍼지 (fuzzy)'비교가 거의 동일한 방법으로 이루어져야한다는 점입니다. 동일한 계층이 있습니다. 이 작업을 수행하는 이유 중 하나는 Maya의 두 노드 계층 구조를 서로 다른 두 문자로 일치시켜 하나에서 다른 노드로 애니메이션을 전송하는 것입니다.

필자가 읽은 바를 토대로, 두 개의 노드 이름이 서로 얼마나 비슷한 지 비교하기위한 이름 임계 값 (필자 자신을 만들 수있는)이 필요할 것입니다. 그런 다음 자식 노드가 계층 구조에 나타나는 순서를 선택적으로 무시하는 방법이 필요합니다. 마지막으로 노드가 약간 위 또는 아래로 이동 한 경우 깊이 임계 값을 처리해야합니다.

답변

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 모듈이 있습니다. 두 번째로 많이 사용되는 계층 구조는 ElementTree (보통 lxml을 통해)가있는 XML 메시지입니다. 이 두 가지 후에, 위의 구조를 리터럴 재사용 가능한 모듈이 아닌 클래스의 템플릿으로 사용합니다.

+0

매우 사실입니다. 퍼지 계층 비교 및 ​​일치를 수행하기위한 일반적인 도구를 누군가가 가지고 있기를 바랬습니다. – Soviut

+0

이 문맥에서 "퍼지"란 의미는 무엇입니까? 추가 사실로 질문을 업데이트하십시오. –

+0

나는 나의 질문을 분명히했다. – Soviut

2

xmldifff http://www.logilab.org/859을 조사하고 노드를 비교하고 병렬 트리를 처리하는 방법을 확인하는 것이 좋습니다. 또는 트리에 각 [중요] 노드를 생성하는 [재귀 적] 생성기 (예 : f(t))를 작성한 다음 itertools.izip(f(t1),f(t2))을 사용하여 비교할 노드 쌍을 수집하십시오.

내가 다루는 계층 구조의 대부분은 XML의 요소 및 특성과 같이 하나 이상의 "축"을 가지며 일부 노드는 다른 노드보다 중요합니다.

좀 더 기괴한 해결책을 얻으려면 두 개의 트리를 텍스트 파일로 직렬화하고 라인 #n이 트리의 노드 #x에서 오는 참조 참고를 작성하십시오. 두 나무를 모두 수행하고 파일을 diff로 보내고 결과를 스캔하여 나무의 어느 부분이 변경되었는지 확인합니다. 해당 라인 #n을 파일 1 (따라서 첫 번째 트리의 노드 #x)과 파일 # 2의 라인 #m (따라서 두 번째 트리의 노드 #y)과 매핑하면 각 트리의 일부분이 동일하거나 다른.

어떤 솔루션이든 비교 프로세스에서 무시할 수있는 공백, 표시 특성, 선택 노드 등을 모두 삭제할 수있는 "표준 양식"을 만들어야합니다. 또한 트리의 깊이 우선 트래버스와 너비 우선 트리를 수행하는 것을 의미 할 수도 있습니다.