2017-01-09 96 views
9

如果我有一個元素,我試圖從字典中獲得: my_dict[i]['level_1']['level_2']['my_var']Python是否有一個乾淨的測試字典元素?

有沒有比檢查空值的方法更清潔的方法?

if 'level_1' in my_dict[i]: 
    if 'level_2' in my_dict[i]['level_1']: 
     if 'my_var' in my_dict[i]['level_1']['level_2']: 
      my_var = my_dict[i]['level_1']['level_2']['my_var'] 
+8

你可以使用'dict.get' - 'my_dict [i] .get('level_1',{})。get('level_2',{ })得到( 'my_var')'。如果沒有找到,它將是'None'。 – jonrsharpe

+7

或'嘗試 - 除了KeyError'塊 –

+4

你的方法在這裏完全取決於你想要完成什麼和你想要的行爲。取決於你的性質,一個簡單的'my_var = my_dict [i] ['level_1'] ['level_2'] ['my_var']'包裹在'try-except'中可能是要走的路,或者jonsharpe提出的建議。數據。 –

回答

7

你可以簡單地定義自己:

def get_deep(dic,*keys,default=None): 
    for key in keys: 
     if isinstance(dic,dict) and key in dic: 
      dic = dic[key] 
     else: 
      return default 
    return dic 

或者,如果你想測試:

def in_deep(dic,*keys): 
    for key in keys: 
     if isinstance(dic,dict) and key in dic: 
      dic = dic[key] 
     else: 
      return False 
    return True 

您可以使用此代碼in_deep(my_dict[i],'level1','level2','my_var'),如果它能夠將返回True確實在字典中深入瞭解。如果你想獲得深的元素,你可以撥打get_deep(my_dict[i],'level1','level2','my_var')get_deep將返回default參數(默認爲None),以防萬一它無法到達路徑。

3

這裏是我的一行:

# returns False or the value of the end element 
reduce(lambda x, y: x and y in x and x[y], list_of_keys, target_dictionary) 

例子:

a = {'b': {'c': {'d': True}}} 
reduce(lambda x, y: x and y in x and x[y], ['b', 'c', 'd'], a) # True 
reduce(lambda x, y: x and y in x and x[y], ['b', 'cd', 'd'], a) # False 

工作原理:在減少每次迭代,它會檢查previouis鍵是在目標字典(x) 。如果不是,則立即返回False,因爲and條件,並將其傳播到列表中。然後,它會檢查所請求的密鑰是否在字典中(x in y)。如果是這樣,它會將較低級別的字典傳遞到較低級別,如x。注意:最後一個元素(a ['b'] ['c'] ['d'])必須評估爲True。如果你期望False在最後,請檢查最後一級:'d' in reduce(...)

相關問題