【发布时间】:2014-01-14 05:28:07
【问题描述】:
目前我正在使用以下方法,假设字典
data[a][b][c]
我用:
if "a" in data and "b" in data["a"] and "c" in data["a"]["b"]:
...
有没有更好的办法?
【问题讨论】:
-
“按原样”投票:)
标签: python
目前我正在使用以下方法,假设字典
data[a][b][c]
我用:
if "a" in data and "b" in data["a"] and "c" in data["a"]["b"]:
...
有没有更好的办法?
【问题讨论】:
标签: python
有两种解决方案:
您可以使用defaultdict,并用另一个defaultdict 实例化一个内部级别。然后,如果缺少密钥,它将返回一个空字典而不会引发错误:
from collections import defaultdict
>>> d = defaultdict(lambda: defaultdict(dict))
>>> d['a']['b']
{}
如果您需要更多关卡,您只需链接多个lambda。
部分参考:Multiple levels of 'collection.defaultdict' in Python
另一种方法是用try/except块包围dict访问并通过KeyError异常管理丢失的键(停止程序,返回默认值等)
try:
x = data[a][b][c]
# same code of your if statement
except KeyError:
# stuff you do in your else
【讨论】:
我通常会使用该模式
foo = data.get("a",{}).get("b",{}).get("c",False)
if foo:
...
这要求嵌套的深度始终相同,并且 data["a"]["b"]["c"] 不是“假的”。
【讨论】:
你可以把它包装在一个 try/except 块中
try:
x = data[a][b][c]
...do stuff in your "if" clause
except KeyError:
...do stuff in your "else" clause
【讨论】:
如果您需要经常进行这种多级查找,这个辅助方法会很有用:
def multi_get(dict_obj, *attrs, default=None):
result = dict_obj
for attr in attrs:
if attr not in result:
return default
result = result[attr]
return result
要使用它,只需这样称呼它:
x = multi_get(data, 'a', 'b', 'c', default=False)
【讨论】: