2014-05-05 61 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