2017-02-27 77 views
0

如果我有一個字典,d和我想檢查一個值d['e']['foo']['bar']其中e和foo是字典,並且bar給出一個字符串什麼是一種方法安全地獲得該位置的價值?除了嘗試抓住之外還有什麼?如何安全地檢查一個Python字典是否有遞歸存儲的多個密鑰字典對

+0

你可以嘗試使用'collections.defaultdict()單曲。見http://stackoverflow.com/questions/5029934/python-defaultdict-of-defaultdict – synchronizer

+0

@synchronizer,然後只檢查值是一個「真正的」一個或沒有。謝謝! – Bren

+0

可以肯定的是,我正在編寫一個快速程序來驗證我所說的內容。 – synchronizer

回答

3

一個好方法是使用reduce

d={'e':{'foo':{'bar':"final value"}}} 
l=['e','foo','bar'] 
print reduce(lambda x,y:x.get(y),l, d) 

,您可以撥打function並傳遞list給它。

輸出:final value

+0

@但如果它的鍵-val對丟失,你會得到一個異常。我想補充一下。get(y,默認)將會消除這種情況。雖然然後我會得到一個類型的例外None.get – Bren

+0

@Bren,但在任何情況下,你將不得不處理這種情況.....但在這種方法中,您可以使用列表中的變量值...其通用功能....我給你留下錯誤處理....'.get'有一個默認值'None'.You'' exception – vks

+0

@Bren這將工作所有長鏈和小的 – vks

0

確保鑰匙在此快譯通,你可以試試這個:

if "e" in d: 
    print d["e"] 

或者嘗試使用get方法,如果密鑰不可然後返回默認值。

如果鍵在字典中,則返回鍵的值,否則爲默認值。如果 默認沒有給出,則默認爲無,所以,這種方法從未 拋出一個KeyError。

d.get("e","default value") 
1

使用get有一個空的字典的默認:

>>> d = {'e':{'foo':{'bar':0}}} 
>>> print(d.get('e', {}).get('foo', {}).get('bar')) 
0 
>>> print(d.get('f', {}).get('doo', {}).get('car')) 
None 
>>> print(d.get('e', {}).get('foo', {}).get('car')) 
None 
>>> print(d.get('e', {}).get('doo', {}).get('bar')) 
None 
+0

我正在嘗試避免長鏈。但是這在技術上會起作用。 – Bren

1

一種方法是沿着這些線路使用一個簡單的輔助功能:

def dive(d, *ks): 
    for k in ks: 
     if isinstance(d, dict) and k in d: 
      d = d[k] 
     else: 
      return None 
    return d 

examples = [ 
    {}, 
    {'e': {'foo': 12}}, 
    {'e': {'foo': {'bar': 999}}}, 
] 

for i, e in enumerate(examples): 
    print(i, dive(e, 'e', 'foo', 'bar')) 

輸出:

(0, None) 
(1, None) 
(2, 999) 
相關問題