2013-03-22 42 views
0

的字典修改值假設我有一個看起來像這樣的列表,但在深度和複雜性可能會有所不同:Python。在未知深度

inc = {'root': 10, 
    'values': { 
     'left': {8: { 
      'left': { 
       6: { 
        'left': 5, 
        'right': 11} 
        }, 
      'right': { 
        10: { 
        'left': 2, 
        'right': 11} 
       }}}, 
     'right' : { 
        12: { 
        'left': 5, 
        'right': 20} 
        }}} 

我需要做的是遍歷它,找到最低的左值和最左邊的值(即,通過訪問字典的'左'元素達到的值)並交換它們。遞歸遍歷字典以查找值不是問題。問題是在確定需要更改什麼之後找到必要的值。

功能用於迭代:

leftmost = 0 
lowest = 0 

def walk_dict(d): 
    global leftmost, lowest 

    for k,v in sorted(d.items()): 
     if isinstance(v, dict): 
      walk_dict(v) 
     else: 
      if k == 'left': 
       if leftmost == 0: 
        leftmost = v 
       if v < lowest: 
        lowest = v 
+0

值得注意的是,這是一種在字典中存儲二叉樹的奇怪方法。我覺得使用嵌套列表更自然,或者做一些類似'{'value':5,'left':{'value':4},'right':{'value':7,'left' :{'value':12}}}'。 – Dougal 2013-03-22 23:05:59

回答

1

而不是直接保存值,保持字典抱着他們,這樣你就可以在最後交換值,例如:也

[in the loop] 
    if k == 'left': 
    if not leftmost: 
     leftmost = d 
    if v < lowest['left']: 
     lowest = d 

# swap 
lefmost['left'], lowest['left'] = lowest['left'], lefmost['left'] 

我我不確定你的最左邊的的定義,但如果它意味着最少的深度鍵等於「左」,那麼你的代碼是錯誤的,因爲它只是抓取在深度優先遍歷期間找到的第一個值。爲了克服這個問題,你可以保持當前的深度並比較它,以確定是否應該覆蓋最左邊的值。

+0

最左邊是最深的鍵,只有走左才能到達凸輪。所以代碼是正確的。感謝您的答案,它的工作。 – 2013-03-23 09:47:15

+0

啊,好吧,那會好起來的!我一直在考慮樹從左到右的增長,因爲它是由代碼中的Python字典表示的:) – tomasz 2013-03-23 15:26:01