2016-09-14 2 views
2

나는파이썬 튜플 목록을 트리로 변환하는 방법은 무엇입니까? 그래서, 어떤 노드가 I 시도 부모 및/또는 자녀 를 가질 수</p> <pre><code>{ parent: [(id, name), (id, name)], parent: {parent: [(id, name)] { </code></pre> <p>:

list_of_tuples = [(number, name, id, parent_id), 
    (number, name, id, parent_id), 
    ] 

내가 좋아하는 정렬 된 구조로 정렬 노력하고 같은 튜플의 목록을 가지고 로 :

tree = defaultdict(lambda: [None,()]) 
ancestors = set([item[3] for item in list_of_tuples]) 

for items in list_of_tuples: 
    children_root = {} 
    descendants = [] 
    number, name, id, parent = items 
    if parent is None: 
     tree[id] = [(id, name)] 
    elif parent: 
     if parent not in tree.keys(): 
      node = tree.get(parent) 
      node.append((id, name)) 
     children = (id, name) 
     tree[parent].append(children) 

그러나 노드가 부모와 자녀

모두를 가질 때 나는 깊은 계층을 잃고

주문 작업을 올바르게 수행하려면 어떻게해야합니까?

+1

것은, 이것은 단순히 문제 –

+0

이유는 단지 키 = ID로 DICT을하지 않을 수 있습니다. – stark

+0

당신이 목표로 삼고있는 구조는 약간 특이합니다. 일반적으로 트리 노드에는 부모가 아닌 자식에 대한 정보가 있습니다. 또한 어떤 정보가 특정 노드 (tree/_dict_에있는 것처럼)와 관련이 있습니까? _신분증_? _이름_? 하지만 _number_ 아닌가요? – CristiFati

답변

1

트리 노드를 튜플 ((id, name), dict_of_children)으로 나타 내기를 제안합니다. 당신이 parent_id``로 노드를 정렬하고 소스 노드를 리프 노드에서 시작하는 경우

list_of_tuples = [(1, 'name1', 1, None), 
    (2, 'name2', 2, 1), 
    (3, 'name3', 3, 1), 
    (4, 'name4', 4, 2), 
    (5, 'name5', 5, 2), 
    (6, 'name5', 6, None), 
    (7, 'name5', 7, 6), 
    ] 

def build_tree(list_of_tuples): 
    """ 
    >>> import pprint 
    >>> pprint.pprint(build_tree(list_of_tuples)) 
    {1: ((1, 'name1'), 
     {2: ((2, 'name2'), {4: ((4, 'name4'), {}), 5: ((5, 'name5'), {})}), 
      3: ((3, 'name3'), {})}), 
    6: ((6, 'name5'), {7: ((7, 'name5'), {})})} 
    """ 
    all_nodes = {n[2]:((n[2], n[1]), {}) for n in list_of_tuples} 
    root = {} 
    for item in list_of_tuples: 
     number, name, id, parent = item 
     if parent is not None: 
      all_nodes[parent][1][id] = all_nodes[id] 
     else: 
      root[id] = all_nodes[id] 
    return root 
+0

은 가장 깊게 중첩 된 쌍만 반환하지만 얕은 목록이나 터플에서 중첩 된 계층 구조를 설정하는 데 사용할 수 있습니다! 좋은! – noise

+0

하나의 루트 노드 만 예상되므로 여러 루트와 함께 작동하도록 수정할 수 있습니다. – gavriel

+0

편집했습니다. 이제 여러 개의 루트 노드를 허용합니다. – gavriel