如何使用.get()获取嵌套字典键值

时间:2014-05-05 01:50:35

标签: python dictionary

使用简单的字典:

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

我可以安全地使用:

print myDict.get('key3')

即使'key3'不存在也不会抛出错误,因为.get()仍然会返回None。

现在我如何使用嵌套密钥字典实现同样的简单性:

myDict={}
myDict['key1'] = {'attr1':1,'attr2':2}

以下将给出KeyError:

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

这将通过:

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

但它会因adn AttributeError而失败:'NoneType'对象没有属性'get':

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

4 个答案:

答案 0 :(得分:24)

dict.get接受其他default参数。如果没有这样的密钥,则返回value而不是None

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

答案 1 :(得分:4)

关于嵌套字典的主题有一个非常好的blog post from Dan O'Huiginn。他最终建议使用一个更好地处理嵌套的类来对dict进行子类化。这是修改的子类,用于处理试图访问非dict值的键的情况:

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

答案 2 :(得分:1)

使用例外:

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

答案 3 :(得分:0)

这是正常的,因为key3不存在,所以

myDict.get('key3')

不返回..

NoneType对象没有属性..

所以你必须存储myDict.get('key3')的值,测试它是否为null然后在存储的项目上使用get方法