2015-11-03 68 views
0

我有python列表和字典的嵌套結構。訪問列表/字典的任意嵌套結構中的元素

tree = { 'blah': [ "booz", {'foobar': [ { 'somekey': 'someval' } ] } ] } 

我也有幾個遞歸函數,讓我穿越從頂部tree層次結構,底部和返回鍵和值,我需要。例如:

def get_objectcontent(obj, objid): 

    result = None 

    if isinstance(obj, dict): 
     for key, val in obj.items(): 
      if key == objid: 
       result = val 
      elif isinstance(val, list) or isinstance(val, dict): 
       retval = get_objectcontent(val, objid) 
       if retval is not None: 
        result = retval 
    elif isinstance(obj, list): 
     for elem in obj: 
      if isinstance(elem, list) or isinstance(elem, dict): 
       retval = get_objectcontent(elem, objid) 
       if retval is not None: 
        result = retval 

    return result 

不幸的是,我想修改tree中的數據,那就是問題所在。唯一可能的解決,我可以看到的是動態構造的「路徑」,以元素,而走通過tree並構建類似:

tree['blah'][1]['foobar'][0]['somekey']) = 'newval'

我沒有找到任何辦法,我怎麼能指出我的鍵入Python(當我知道它在結構中的位置時)。

在Python 3中還有其他更智能的方法來解決這個問題嗎?

回答

0

你最終尋找objid如在dict的關鍵,所以你可以改變:

result = val 

到:

result = obj 

然後調用者可以這樣做:

result[objid] = new_val 

您也可以考慮將作業替換爲resultreturn陳述,假設你不介意得到第一個實例,而不是最後一個。

+0

謝謝,非常簡單。 – tvm