python:动态地获取dicts中的子序列?

时间:2015-01-20 07:14:04

标签: python dictionary

假设我想编写一个函数,它将从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,则为空字符串。

我是否以正确的方式解决这个问题?

2 个答案:

答案 0 :(得分:3)

您应该使用标准defaultdicthttps://docs.python.org/2/library/collections.html#collections.defaultdict

有关如何嵌套它们的信息,请参阅:defaultdict of defaultdict, nestedMultiple 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,而不是一个空字符串,但除此之外它看起来像你在问题中所要求的那样。