2014-09-22 77 views
0

在我的詞典中,我希望能夠從我的subkey*屬性中提取value。但是,如果subkey*不存在,我想自動返回父母的value如果孩子的密鑰不存在,則返回父字典的父值

d = { 
'key1' : { 
    'value': "parent-key1", 
    'subkey1': { 
     'value': "child1" 
    }, 
    'subkey2': { 
     'value': "child2" 
    } 
}, 
'key2': { 
    'value': "parent-key2", 
    'subkey1': { 
     'value': "child3" 
    }, 
    'subkey2': { 
     'value': "child4" 
    } 
} 

}

我的函數存根看起來是這樣的:

def get_values(my_dict_value): 
    try: 
     return my_dict_value 
    except KeyError: 
     # How do I find the parent value of my_dict_value? 

我的預期結果是:

>>> get_values(d['key1']['subkey1']['value']) 
child1 
>>> get_values(d['key1']['subkey3']['value']) 
parent-key1 

如何找到我的字典父價值?

+1

在你輸入func之前,'KeyError'會被喚醒*灰。您可能希望將您想要從字典中獲得的三個鍵傳遞給該函數,以便您可以捕獲函數中的「KeyError」。 – SethMMorton 2014-09-22 19:37:11

回答

0

作爲SethMMorton mentions,您的當前方法將在它進入函數之前拋出一個關鍵錯誤。

你可以通過傳遞兩個值到你的函數 - parentchild來解決這個問題。因爲您的示例顯示兩者都使用value的密鑰,所以我放棄了第三項。該功能可以自動處理。

def get_values(key, subkey): 
    try: 
     return d[key][subkey]['value']  
    except KeyError: 
     try: 
      return d[key]['value'] 
     except KeyError: 
      return "Not found" 

這利用了嵌套的異常,如果你比深度更深入,將會變得非常混亂。但是,外部try區塊嘗試返回您的parent/child/value。如果不存在,則嘗試返回parent/value。如果不存在,則返回Not found

你可以這樣調用:

print get_values("key1", "subkey1") 
print get_values("key1", "subkey3") 
print get_values("key4", "subkey1") 

此輸出:

child1 
parent-key1 
Not found 
1

這裏是解決它的嵌套字典,get的另一種方式方法:

>>> 
>>> d = { 
... 'key1' : { 
...  'value': "parent-key1", 
...  'subkey1': { 
...   'value': "child1" 
...  }, 
...  'subkey2': { 
...   'value': "child2" 
...  } 
... }, 
... 'key2': { 
...  'value': "parent-key2", 
...  'subkey1': { 
...   'value': "child3" 
...  }, 
...  'subkey2': { 
...   'value': "child4" 
...  } 
... }} 
>>> 
>>> def get_value(key, subkey): 
...  dkey = d.get(key) 
...  return dkey.get(subkey, {}).get('value', dkey.get('value')) 
... 
>>> print get_value("key1", "subkey1") 
child1 
>>> print get_value("key2", "subkey2") 
child4 
>>> print get_value("key2", "subkey3") 
parent-key2 
>>>