2017-04-19 90 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