2015-11-03 49 views
2

我有列表中有字典的鍵。如何動態使用這些密鑰訪問字典。 e.g我有名單有字典的鍵。如何使用這些密鑰動態訪問字典

key_store = ['test','test1'] 

mydict = {"test":{'test1':"value"},"test3":"value"} 

因此,如何利用key_store我要訪問mydict['test']['test1']訪問mydict

注:key_store店關鍵字的深度意味着它有一個關鍵字只有它的價值將是字典樣測試有字典,以便它有「測試」,「TEST1」

+0

家業需要什麼樣的輸出上面的測試案例? –

回答

1

使用遞歸:

def get_value(d, k, i): 
    if not isinstance(d[k[i]], dict): 
     return d[k[i]] 
    return get_value(d[k[i]], k, i+1) 

的參數是字典,列表和您將運行的索引。

停止條件很簡單;一旦該值不是字典,就要返回該字典,否則您將繼續在字典中使用列表中的下一個元素。


>>> key_store = ['test','test1'] 
>>> Dict = {"test":{'test1':"value"},"test3":"value"} 
>>> def get_value(d, k, i): 
...  if isinstance(d[k[i]], str): 
...   return d[k[i]] 
...  return get_value(d[k[i]], k, i+1) 
... 
>>> get_value(Dict, key_store, 0) 
'value' 
+0

好的謝謝你的快速回復我會檢查並回到你 – user3048148

+2

@ user3048148不客氣。不要只是「檢查」,嘗試理解更重要。 – Maroun

+1

另請注意,在我的解決方案中,我期望「路徑」(列表)導致一個值是一個字符串。 – Maroun

1

你可以用一個簡單的for循環做到這一點。

def get_nested_key(keypath, nested_dict): 
    d = nested_dict 
    for key in keypath: 
     d = d[keypath] 
    return d 

>>> get_nested_key(('test', 'test1'), Dict) 

根據需要添加錯誤檢查。

0

你可以用一個簡單的字典這樣做減少:

>>> mydict = {"test": {'test1': "value"}, "test3": "value"} 
>>> print reduce(dict.get, ['test', 'test1'], mydict) 
value 
+0

我喜歡這個!唯一的問題似乎是,如果密鑰不存在,你會得到'None'而不是'KeyError',我認爲這是對這個錯誤最明顯的反應。您無法區分「None」鍵和不存在鍵的值。 –

+1

同意。我不清楚這些邊緣案例之間的理想行爲。它可以改爲'reduce(dict .__ getitem__,['test','test1'],mydict)',然後當密鑰不存在時會引發錯誤(例如'['test','test2 ']'),當它試圖查找一個值(例如'['test','test1','value']'),儘管是不同的錯誤。如果isinstance(x,dict)else None,['test','test1'],mydict)'也可以改爲'reduce(lambda x,y:x [y])在這兩種情況下都返回None。 – Colin

相關問題