递归访问未知维度Python字典中的项

递归访问未知维度Python字典中的项,python,recursion,dictionary,Python,Recursion,Dictionary,我试图获取一个对象列表,并根据对象的“键”将它们重新排列到嵌套字典中。每个键都以已知模式包含其父字典的键。我遇到的问题是能够访问像 hier_data['1']['Assets']['1.2']['Assets']['1.2.3']['Assets']['1.2.3.4']['Assets'] …动态地添加到它中。有没有一种方法可以构建某种递归函数,根据键遍历字典?例如,如果我需要添加键为“1.2.3.4.5”的对象,是否有方法 hier_data['1']['Assets']['1.2'][

我试图获取一个对象列表,并根据对象的“键”将它们重新排列到嵌套字典中。每个键都以已知模式包含其父字典的键。我遇到的问题是能够访问像

hier_data['1']['Assets']['1.2']['Assets']['1.2.3']['Assets']['1.2.3.4']['Assets']
…动态地添加到它中。有没有一种方法可以构建某种递归函数,根据键遍历字典?例如,如果我需要添加键为“1.2.3.4.5”的对象,是否有方法

hier_data['1']['Assets']['1.2']['Assets']['1.2.3']['Assets']['1.2.3.4']['Assets']['1.2.3.4.5'] = {...}
…动态和递归


我应该注意,我开始的列表是按键排序的,因此我应该始终可以将当前对象的父对象的“资产”字典添加到列表中

您可以使用递归的
defaultdict

>>> from collections import defaultdict
>>> l = lambda: defaultdict(l)
>>> d = defaultdict(l)
>>> d['123']['4234']['asd']['dsaf'] = 4
>>> d
    defaultdict(<function <lambda> at 0x15f9578>, {'123': defaultdict(<function <lambda> at 0x15f9578>, {'4234': defaultdict(<function <lambda> at 0x15f9578>, {'asd': defaultdict(<function <lambda> at 0x15f9578>, {'dsaf': 4})})})})
>>从集合导入defaultdict
>>>l=lambda:defaultdict(l)
>>>d=默认DICT(l)
>>>d['123']['4234']['asd']['dsaf']=4
>>>d
defaultdict(,{'123':defaultdict(,{'4234':defaultdict(,{'asd':defaultdict(,{'dsaf':4})})})

结果证明我遇到的问题比我想象的要简单。我所需要做的就是这样:

hier_data = {}
for id in sorted(data.iterkeys()):
  key = id.split('.')
  data[id]['Assets'] = {}
  insert_point = hier_data
  for i in range(len(key)/2-1):
    insert_point = insert_point['.'.join(key[0:2*i+2])]['Assets']
  insert_point[id] = data[id]
return hier_data

我认为从字典(例如,
hier\u data[…]
)获取键将返回字典中该点的对象副本,而不是指向该对象的指针。事实证明,我所需要的只是在我的分解键上迭代,将我的
插入点
光标移动到正确的位置,以添加到我的对象中。

当然,但是。。。为什么要这样存储它,而不仅仅是
hier_数据['1.2.3.4.5']['Assets']
?这是一个脆弱的数据结构。考虑一棵树……DavidRobinson,我想输出数据结构的嵌套JSON,这样我就可以在客户端绘制嵌套的
  • s。我肯定有更好的方法,我只是不知道。谢谢。我不知道迪克特的事。这会很有帮助,除了我的键是被排序的,所以我永远不会遇到这样的情况,我没有一个特定条目的父键。我真正想要的是如何获得作业链['1']['23']['456']['7890']]。。。动态地,而不必在代码中包含每个括号。此外,我在学习时发现了这种优雅的写作方式: