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

新手上路,请多包涵

使用像这样的简单字典:

 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')

但它会失败并显示 AttributeError: ‘NoneType’ object has no attribute ‘get’:

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

原文由 alphanumeric 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

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

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

原文由 falsetru 发布,翻译遵循 CC BY-SA 3.0 许可协议

Dan O’Huiginn 有一篇关于嵌套字典主题的非常好的博客文章。他最终建议将 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

原文由 jxstanford 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题