将String转换为多级字典键?

Sme*_*Cat 3 python dictionary

我让用户能够检查多级字典中的特定键.我的想法是他们会像这样将路径传递给密钥:

root.subelement1.subelement2.key
Run Code Online (Sandbox Code Playgroud)

这可以是任意长度和深度.

一旦我有了用户的字符串(上面),我将拆分它并获得每个组件的列表:

elements = ['root', 'subelement1', 'subelement2', 'key']
Run Code Online (Sandbox Code Playgroud)

所有这些我都能做到.接下来的部分是我被困住的地方.当它是任意长度时,如何查询由上面指定的字典键?

我最初的想法是做一些像my_dict[elements[0]][elements[1]]......但当我的用户没有完全按照我期望的长度传递时,这不会扩展或工作.

在这种情况下,如何以任意键深度获取数据?


几个例子:

  • 用户通过country.US.NewYork=>我查询`my_dict ['country'] ['US'] ['NewYork']
  • 用户通过department.accounting=>我查询my_dict['department']['accounting']
  • 用户通过id=>我查询my_dict['id']
  • 用户通过district.District15.HenryBristow.principal=>我查询my_dict['district']['District15']['HenryBristow']['principal']

Jea*_*bre 6

你可以使用reduce它来查询嵌套字典中的键:

q = "district.District15.HenryBristow.principal"
my_dict  = {"district" : {"District15" : {"HenryBristow" : {"principal" : 12}}}}

from functools import reduce  # python 3 only

print(reduce(lambda x,y : x[y],q.split("."),my_dict))
Run Code Online (Sandbox Code Playgroud)

结果:

12
Run Code Online (Sandbox Code Playgroud)

如果您想避免KeyError在此路径中不存在数据的情况下捕获,则可以使用get默认值作为空字典:

reduce(lambda x,y : x.get(y,{}),q.split("."),my_dict)
Run Code Online (Sandbox Code Playgroud)

尝试获取未知值会返回一个空字典.唯一的缺点是你不知道路径到底在哪里丢失了,所以也许离开KeyError被提升不会那么糟糕:

try:
    v = reduce(lambda x,y : x[y],q.split("."),my_dict)
except KeyError as e:
    print("Missing key: {} in path {}".format(e,q))
    v = None
Run Code Online (Sandbox Code Playgroud)