Как получить значение ключа вложенного словаря.получить()

С простым словарем, как:

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 ответов


dict.get принимает дополнительные


есть очень хороший сообщение в блоге от Dan O'Huiginn по теме вложенных словарей. В конечном итоге он предлагает подклассы dict с классом, который лучше обрабатывает вложенность. Вот подкласс, измененный для обработки вашего случая, пытаясь получить доступ к ключам значений non-dict:

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

Вы можете ссылаться на вложенные существующие ключи или те, которые не существуют. Вы можете смело использовать квадратные скобки для доступа, а не .получить.)( Если ключ не существует в 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

использование исключений:

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

это нормально, так как key3 не существует так

myDict.get('key3')

возвращает none..

объект NoneType не имеет атрибута..

таким образом, вы должны сохранить значение myDict.get ('key3'), проверьте, не является ли он нулевым, а затем используйте метод get для сохраненного элемента