2016-09-14 106 views
2

我有這樣如何將元組的python列表轉換爲樹?

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

我試圖把它整理成像一個有序的結構元組的列表:

{ 
    parent: [(id, name), (id, name)], 
    parent: {parent: [(id, name)] 
{ 

因此,任何節點可以有一個父和/或兒童 我試着搭配:

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

如果排序'parent_id'節點和葉節點啓動源節點,這可能只是問題 –

+0

爲什麼不乾脆讓與主要= ID的字典。 – stark

+0

你所瞄準的結構有點不同尋常。通常,樹節點具有關於孩子而不是父母的信息。還有什麼信息與特定節點相關(因爲它將在樹/ _dict_中)? _ID_? _名稱_?但不是_號碼? – CristiFati

回答

1

我建議將樹節點表示爲元組((id,name),dict_of_children)。

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