2017-04-19 88 views
-1

所以我有一個列表,它充當各種「映射」,以及一個從JSON文件中提取的字典。設置未知深度的嵌套字典的值?

在這個例子中,可以說,他們是這樣的:

L = ['One', 'Two', 'Three'] 

D = { 
    "One": { 
     "Two": { 
      "Three": { 
       "Four": "String" 
      } 
     } 
    } 
} 

我需要爲我的遊戲功能。

我會通過它兩件事:LObject

請注意,L只是導致"Three"所以這就是我想要取代。雖然,我可以替換"Four"或其他任何未知的元素。

我正在更換可能是一個stringlist,或dict,我可以與任何其他對象替換它,包括None,或bool

D的結構需要保持不變,除了值被替換。

+0

那麼,什麼是結果的例子嗎? – fl00r

+0

這不是重複的。我想'設置'的價值,而不是檢查它。 – Cyanite

回答

0

該函數將字符串列表作爲一個路徑和一個對象來替換定位值,對全局變量nested_dicts進行操作。如果你想堅持一個功能範例,你可能需要相應地重寫它。

def replace (path, replacement): 
    pointer = nested_dicts 
    try: 
     for key in path[:-1]: 
      pointer = pointer[key] 
    except KeyError: 
     return False 
    pointer[path[-1]] = replacement 
    return True 
+0

結果只是路徑的最終值,它是新的值,其餘的'D'需要保持不變。 – Cyanite

+1

我不明白你的陳述「結果只是最終的價值,它是新的價值」。這是你認爲我的代碼做什麼,或者你想要它做什麼?它所做的是替換指定的值,並保持其餘的完整。 –

+1

對不起,我正在檢查'pointer'的結果,我不知道它取代了原來的。 – Cyanite

0

像這樣的作品(pathLo是更換):

L = ['One', 'Two', 'Three'] 

D = { 
    "One": { 
     "Two": { 
      "Three": { 
       "Four": "String" 
      } 
     } 
    } 
} 

def replace(path, o): 
    cur = D 
    for k in path[:-1]: 
     cur = cur[k] 
    cur[path[-1]] = o 

replace(L, {'msg': 'good'}) 
print(D) 
+0

這與之前的答案相同,它不返回我正在查找的值。 – Cyanite

+0

以及我實際上嘗試過,它確實有效。發佈完整代碼 – lang2

+0

..哦......它是如何將值設置爲「D」的?我正在檢查'cur' – Cyanite