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

时间:2013-03-05 07:10:55

标签: 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']['Assets']['1.2.3']['Assets']['1.2.3.4']['Assets']['1.2.3.4.5'] = {...}

...动态和递归?

我应该注意,我开始的列表是按键排序的,这样我就可以始终将当前对象的父级'Assets'字典添加到。

2 个答案:

答案 0 :(得分:1)

您可以使用递归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})})})})

答案 1 :(得分:0)

原来我遇到麻烦的事情比我想象的要简单。我需要做的就是这样:

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_data[...])将返回字典中该点的对象副本,而不是指向该对象的指针。事实证明,我需要的是迭代我的分解键,将我的insert_point光标移动到正确的位置以添加到我的对象中。