2016-03-29 16 views
4

我很難嘗試按照以下方式安排字典給定數字,在輸入框中輸入5,然後在字典中搜索key=5,然後在字典中輸入它的第一個值4並搜索key=4並把其值分別爲第二和隨後的5第二值,它是3和字典搜索key=3,並把它作爲第三如何安排字典?

值的值將是一個或兩個整數

我在工作繪製一棵二叉樹,所以如果根節點(父母)是5他就會更容易重新成爲第一,那麼它的孩子,孩子等下一

我試着用OrderedDict安排,但我找不到離開它

有人能幫助我嗎?

輸入:

{8: [9], 3: [6, 8], 4: [2, 1], 5: [4, 3], 6: [0, 7]} 

輸出:

{5: [4, 3], 4: [2, 1], 3: [6, 8], 6: [0, 7], 8: [9]} 

更新的代碼:

def dfs(cur, prev, edges, res): 
    for next in edges[cur]: 
     if next == prev: continue 

     res.setdefault(cur, []).append(next) 

     dfs(next, cur, edges, res) 


def construct_tree(edges, root): 
    d = {} 
    x = [] 
    for edge in edges: 
     u, v = edge 
     d.setdefault(u, []).append(v) 
     d.setdefault(v, []).append(u) 

    res = {} 

    dfs(root, -1, d, res) 

    return res 

if __name__ == '__main__': 

     root_node = 5 
     edges = [[2, 4], [4, 1], [0, 6], [7, 6], [8, 9], [4, 5], [6, 3], [3, 5], [3, 8]] 
     print((construct_tree(edges, root_node))) 
+0

輸入在哪裏,即密鑰的順序來自哪裏?從輸入或raw_input字面? – timgeb

+0

我想根據詞典中的根節點(鍵)排列它,首先根節點= 5,然後根節點的值,然後在詞典的鍵中搜索它,然後將它放到下一個 – Joe

+0

,結束,如果字典鍵中沒有數值,則繼續 – Joe

回答

3

這是一個有趣的問題,因爲它比你想象的要複雜得多。這會降低路徑查找的速度,因此深度優先搜索和廣度優先搜索都是重要的考慮因素。

從您的樣品進/出,看起來您想要廣度優先搜索,所以我們需要一個隊列來解決。當然,您還需要一個OrderedDict來放置節點,以查找並填充它們以及您的示例數據。

from collections import OrderedDict 
from queue import Queue 

sample_dict = {8: [9], 3: [6, 8], 4: [2, 1], 5: [4, 3], 6: [0, 7]} 

你給從某處的第一個節點,因此只需調用一個函數參數,去抓住該鍵的值的每個項目,並把它添加到隊列,然後通過隊列推,直到你'重做!

def sort_the_dict(in_, firstkey): 
    # in_ is your sample data. 
    result_dict = OrderedDict() 
    q = Queue() 
    q.put_nowait(firstkey) 

    while not q.empty(): 
     k = q.get_nowait(): 
     v = in_.get(k) 
     if v is not None: 
      # if a value exists for that key 
      result_dict[k] = v 
      for vv in v: 
       q.put_nowait(vv) 

    return result_dict 
+0

我在這裏收到錯誤v = k.get(in_,k) AttributeError:'int'object has no attribute'get' – Joe

+0

@喬是啊,我有一個腦屁。我已經修復了它。應該是'in_.get(k)' –

+0

現在感謝它的工作 – Joe

2
from collections import OrderedDict 

d = {8: [9], 3: [6, 8], 4: [2, 1], 5: [4, 3], 6: [0, 7]} 

sorted_keys = sorted([x for x in d]) 
sorted_d = OrderedDict(zip(sorted_keys, [d[k] for k in sorted_keys])) 

而不是數字排序,你可以用,但是你要排序取代sorted_keys字典。這就是你如何完成你所要求的,但我會迴應其他評論,並說可能有更好的方法去做你正在做的任何事情。