对深度嵌套字典进行索引的最佳方法是什么?考虑以下示例:
x = {'a': {'b': {'c': {'d': 1}}}}
item = x['a']['b']['c']['d']
有没有一种方便的方法可以提供一条路径?
# something like this
item = x.get_path('a/b/c/d')
您可以使用内置库构建简单的方法,如下所示:
from functools import reduce, partial
from operator import getitem
nested_get = partial(reduce, getitem)
x = {'a': {'b': {'c': {'d': 1}}}}
item = nested_get(["a", "b", "c", "d"], x)
print(item)
输出
1
更新
要模拟dict.get
的行为,请使用:
def nested_get(path, d, default=None):
current = d
for key in path:
try:
current = current[key]
except KeyError:
return default
return current
x = {'a': {'b': {'c': {'d': 1}}}}
item = nested_get(["a", "b", "c", "d"], x)
print(item)
item = nested_get(["a", "b", "e", "d"], x)
print(item)
输出
1
None
这里有一个简单的实现,它大致支持您正在寻找的查找语法。
def get_value(x, path):
for key in path.split('/'):
x = x[key]
return x
x = {'a': {'b': {'c': {'d': 1}}}}
print(get_value(x, 'a/b/c/d'))
给出:
1
如果任何密钥都不存在,那么您将获得一个KeyError
。如果您想要一些其他行为(例如返回None
(,则可以将x = x[key]
行更改为:
try:
x = x[key]
except KeyError:
return None