How to get nested dictionary key value with .get()

雨燕双飞 提交于 2019-12-21 03:42:14

问题


With a simple dictionary like:

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

I can safely use:

print myDict.get('key3')

and even while 'key3' is not existent no errors will be thrown since .get() still returns None.

Now how would I achieve the same simplicity with a nested keys dictionary:

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

The following will give a KeyError:

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

This will go through:

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

but it will fail with adn AttributeError: 'NoneType' object has no attribute 'get':

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

回答1:


dict.get accepts additional default parameter. The value is returned instead of None if there's no such key.

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



回答2:


There is a very nice blog post from Dan O'Huiginn on the topic of nested dictionaries. He ultimately suggest subclassing dict with a class that handles nesting better. Here is the subclass modified to handle your case trying to access keys of non-dict values:

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

You can reference nested existing keys or ones that don't exist. You can safely use the bracket notation for access rather than .get(). If a key doesn't exist on a NestedDict object, you will get back an empty NestedDict object. The initialization is a little wordy, but if you need the functionality, it could work out for you. Here are some examples:

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



回答3:


Use exceptions:

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



回答4:


That's normal since key3 doesn't exist so

myDict.get('key3')

returns none..

NoneType object has no attribute..

So you have to store the value of myDict.get('key3'), test if it's not null and then use the get method on the stored item



来源:https://stackoverflow.com/questions/23463684/how-to-get-nested-dictionary-key-value-with-get

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!