2012-11-27 32 views
1

我問你的意見 我有一個NodeTree類。 然後我有一個函數create_T(d) 這個函數以輸入字典d代表一棵樹,並創建一個節點類型爲NodeTree的樹 你建議我做什麼? 感謝所有Python - Dictionary to NodeTree

+0

你能提供有關的樹字典的結構的詳細信息?你遇到的困難是什麼? –

+0

字典功能需要輸入ga兩個鍵: 'name'=節點的名稱 'children'=具有子節點列表的值(它們本身是同一類型的字典) 字典是一棵樹。 難題是實現這個功能,它作爲字典d的輸入,創建一個節點類型爲NodeTree – antia

回答

0

您的信息很少,所以我做了一些假設。基本上我認爲你需要知道從哪裏開始。如果你選擇一個隨機點,那麼你必須向上和向下工作。如果你能確定哪一個是樹的頂部,那麼你只需要向下工作。我通過進行集合比較來計算樹的頂部,以查看哪個節點不是任何其他節點的子節點。

import itertools 

# NodeTree 
class Node(object): 
    def __init__(self, name): 
     self.name = name 
     self.children = [] 

    def add_child(self, child_node): 
     self.children.append(child_node) 

    def __repr__(self): 
     if not self.children: 
      return '<%s/>' % self.name 
     else: 
      children = ''.join([repr(child) for child in self.children]) 
      return '<%s>%s</%s>' % (self.name, children, self.name) 

# create_T(d) 
def create_tree(tree_dict): 
    # find which node is the top of the tree (assume it is well-formed) 
    all_leaves = set(itertools.chain(*tree_dict.values())) 
    top_of_the_tree = set(tree_dict.keys()) - all_leaves 

    def get_node(name): 
     node = Node(name) 
     for child_name in tree_dict[name]: 
      node.add_child(get_node(child_name)) 
     return node 
    return get_node(top_of_the_tree.pop()) 

print create_tree({'a': ['b', 'c'], 
        'b': ['d'], 
        'c': ['e'], 
        'd': [], 
        'e': [], 
        'f': ['a']}) 

,並提供:

<f><a><b><d/></b><c><e/></c></a></f> 
+0

與我的字典,我得到︰錯誤'類型Unhashanle(字典)' – antia

+0

生成:all_leaves = set(itertools .chain(* tree_dict.values())) – antia

+0

你還沒有告訴我們任何關於你已經試圖解決這個問題的事情。您在StackOverflow上沒有記錄。我挑選了你的問題,做出了很多假設並解決了你的問題,爲你提供了完整的可運行源代碼。您並沒有提供任何正面的反饋意見,而是說您在嘗試數據時出現錯誤,但您沒有提供有關您的數據的任何詳細信息。你需要從討價還價的最後努力工作。考慮這種建設性的反饋。 –