2014-05-05 62 views
8

有了一個簡單的字典,如:如何獲得嵌套的字典鍵值以獲得()

myDict{'key1':1, 'key2':2} 

我可以放心地使用:

print myDict.get('key3') 

,甚至當「KEY3」不存在任何.get()仍會返回None,因此會引發錯誤。

現在我怎麼會達到同樣的簡潔與嵌套鍵詞典:

​​

下面將給出一個KeyError異常:

print myDict.get('key1')['attr3'] 

這將經歷:

print myDict.get('key1').get('attr3') 

但它會失敗,並伴隨着AttributeError:'NoneType'對象沒有屬性'get':

print myDict.get('key3').get('attr1') 

回答

16

dict.get接受額外的default參數。如果沒有這樣的密鑰,則返回value而不是None

print myDict.get('key1', {}).get('attr3') 
+0

謝謝!很高興知道! – alphanumeric

1

使用異常:

try: 
    print myDict['key1']['attr3'] 
except KeyError: 
    print "Can't find my keys" 
+1

同意,但例外增加了很多額外的行... – alphanumeric

+0

現在爲什麼地獄不能我想到這個?!? –

0

這是正常的,因爲KEY3不存在,因此

myDict.get('key3') 

回報沒有..

NoneType對象沒有屬性..

所以你必須存儲myDict.get('key3')的值,測試它是否爲空,然後在存儲的項目上使用get方法

3

關於嵌套字典的主題有一個非常好的blog post from Dan O'Huiginn。他最終建議將類字典與處理嵌套的類更好地分類。下面是修改,以處理您的案件試圖非字典值的訪問鍵子類:

class ndict(dict): 
    def __getitem__(self, key): 
     if key in self: return self.get(key) 
     return self.setdefault(key, ndict()) 

您可以參考現有嵌套鍵或不存在的。您可以安全地使用括號表示進行訪問,而不是.get()。如果一個鍵不存在於NestedDict對象上,則會返回一個空的NestedDict對象。初始化有點羅嗦,但是如果你需要這些功能,它可能適合你。以下是一些示例:

In [97]: x = ndict({'key1': ndict({'attr1':1, 'attr2':2})}) 

In [98]: x 
Out[98]: {'key1': {'attr1': 1, 'attr2': 2}} 

In [99]: x['key1'] 
Out[99]: {'attr1': 1, 'attr2': 2} 

In [100]: x['key1']['key2'] 
Out[100]: {} 

In [101]: x['key2']['key2'] 
Out[101]: {} 

In [102]: x['key1']['attr1'] 
Out[102]: 1