2015-06-04 79 views
1

我正在編寫一個Python腳本,其中給出了格式爲['key1', 'key2', 'key2.key21.key211', 'key2.key22', 'key3']的字符串列表。以編程方式訪問字典中任意嵌套深度的值

列表中的每個值對應於在字典中的條目,以及用於結構類似於​​條目,它們對應於(在本例),嵌套在'key21'密鑰'key211',本身嵌套在'key2'

上面所列內容相應於字典:

x = { 
    'key1' : 'value1', 
    'key2' : { 
       'key21' : { 
          'key211': 'value211' 
         }, 
       'key22' : 'value22' 
       }, 
    'key3' : 'value3' 
    } 

的名稱不一定是定期爲key(n)+;例如,它們可以是food.vegetables.potato的形式。我唯一的保證是鍵名自己,在字典中不包含.字符,並且該字典確實包含原始列表中引用的所有條目。

我的問題是,給定這樣的字符串列表,我如何以編程方式訪問字典中的相應條目?我可以想出使用eval()的解決方案,以及僅使用遍歷/搜索的解決方案,但我想避免調用eval(),並且我得到的印象是遍歷與比較會很慢(因爲dict s不是搜索樹),並且會引起很多令人討厭的異常處理。

+1

您應該自己嘗試一下,然後編輯問題以包含您提出的代碼。 – quamrana

+0

讓我看看我是否正確地讀你的問題:你需要做的是將每個關鍵字(字符串)分割到''.'',然後訪問'original_dict [k [0]] [k [1]] [k [ 2]] ...'因爲有多少結果k有? –

+0

@兩位正好。 quamrana我會在大約半小時內用一個試探性的解決方案進行更新。 – Jules

回答

3

一種方法是編寫一個函數來訪問嵌套字典中的鍵。

def deep_access(x,keylist): 
    val = x 
    for key in keylist: 
     val = val[key] 
    return val 

s = 'key2.key21.key211' 

print deep_access(x,s.split('.')) 

結果:

value211 

另一種方法,如果你想使用類似的語法作爲一個正常的字典訪問,你可以繼承dict並覆蓋__getitem__允許嵌套訪問時,元組密鑰提供:

class NestedDict(dict): 

    def __getitem__(self,keytuple): 
     # if key is not a tuple then access as normal 
     if not isinstance(keytuple, tuple): 
      return super(NestedDict,self).__getitem__(keytuple) 
     d = self 
     for key in keytuple: 
      d = d[key] 
     return d 

>>> nd = NestedDict(x) 
>>> nd['key2'] 
{'key22': 'value22', 'key21': {'key211': 'value211'}} 
>>> nd['key2','key22'] 
'value22' 
>>> nd['key2','key21'] 
{'key211': 'value211'} 
>>> nd['key2','key21','key211'] 
'value211' 

然後您可以類似y根據需要實施__setitem____delitem__

相關問題