假设我想编写一个函数,它将从dict返回一个任意值,如:mydict['foo']['bar']['baz']
,如果没有,则返回一个空字符串。但是,我不知道mydict['foo']
是否必然存在,更不用说mydict['foo']['bar']['baz']
了。
我想做点什么:
safe_nested(dict, element):
try:
return dict[element]
except KeyError:
return ''
但是我不知道如何编写将接受函数中的查找路径的代码。我开始接受一个句点分隔的字符串(如foo.bar.baz
)的路径,所以这个函数可以递归地尝试获得下一个子字典,但这并不像Pythonic。我想知道是否有办法传递dict(mydict
)和我感兴趣的子结构(['foo']['bar']['baz']
),并让函数尝试访问它或返回一个如果遇到KeyError
,则为空字符串。
我是否以正确的方式解决这个问题?
答案 0 :(得分:3)
您应该使用标准defaultdict
:https://docs.python.org/2/library/collections.html#collections.defaultdict
有关如何嵌套它们的信息,请参阅:defaultdict of defaultdict, nested或Multiple levels of 'collection.defaultdict' in Python
我认为这可以满足您的需求:
from collections import defaultdict
mydict = defaultdict(lambda: defaultdict(lambda: defaultdict(str)))
答案 1 :(得分:0)
您可能还想查看addict。
>>> from addict import Dict
>>> addicted = Dict()
>>> addicted.a = 2
>>> addicted.b.c.d.e
{}
>>> addicted
{'a': 2, 'b': {'c': {'d': {'e': {}}}}}
它返回一个空的Dict,而不是一个空字符串,但除此之外它看起来像你在问题中所要求的那样。