python检查多级dict密钥存在

Tom*_*mmy 9 python dictionary

许多SO帖子向您展示如何有效地检查字典中密钥的存在,例如,检查字典中是否已存在给定密钥

如何为多级密钥执行此操作?例如,如果d["a"]["b"]是dict,我怎么能检查是否d["a"]["b"]["c"]["d"]存在而不做像这样可怕的事情:

if "a" in d and isInstance(d["a"], dict) and "b" in d["a"] and isInstance(d["a"]["b"], dict) and ...
Run Code Online (Sandbox Code Playgroud)

是否有一些语法

if "a"/"b"/"c"/"d" in d
Run Code Online (Sandbox Code Playgroud)

我实际上使用的是:我们有jsons,使用解析为dicts,simplejson我需要从中提取值.其中一些值嵌套了三层和四层深度; 但有时价值根本不存在.所以我想要这样的东西:

val = None if not d["a"]["b"]["c"]["d"] else  d["a"]["b"]["c"]["d"] #here d["a"]["b"] may not even exist
Run Code Online (Sandbox Code Playgroud)

编辑:如果某些子项存在但不是字典,则不要崩溃,例如,d["a"]["b"] = 5.

utd*_*mir 13

遗憾的是,没有任何内置语法或公共库来查询这样的字典.

但是,我相信最简单的(我认为它足够有效)你可以做的事情是:

d.get("a", {}).get("b", {}).get("c")
Run Code Online (Sandbox Code Playgroud)

编辑:这不常见,但有:https://github.com/akesterson/dpath-python

编辑2:示例:

>>> d = {"a": {"b": {}}}
>>> d.get("a", {}).get("b", {}).get("c")
>>> d = {"a": {}}
>>> d.get("a", {}).get("b", {}).get("c")
>>> d = {"a": {"b": {"c": 4}}}
>>> d.get("a", {}).get("b", {}).get("c")
4
Run Code Online (Sandbox Code Playgroud)

  • 然后它不起作用.如果["c"]尚未定义,该怎么办?问题的关键在于查看多级别字典密钥是否有效.它可能会被多个级别关闭; 正如`isInstance`废话所示. (3认同)

Tom*_*mmy 2

更新:我最终编写了自己的开源、可 pippable 库,允许人们执行此操作: https: //pypi.python.org/pypi/dictsearch