【发布时间】:2012-09-26 12:21:39
【问题描述】:
扩展名:recursing a dictionary of lists of dictionaries, etc et al (python)
我正在使用 4 个级别的嵌套字典结构,我正在尝试迭代整个嵌套字典并为每个单独的字典提供一个标识号(作为构建项目树并能够分辨的前兆哪个项目节点是父节点,节点有哪些子节点等)
我有这个功能:
def r(y):
cnt = 1
def recurse(y, count):
for i in y.iteritems():
count+=1
i['id'] = count
for k,v in y.iteritems():
if isinstance(v, list):
[recurse(i, count) for i in v]
else:
pass
recurse(y, cnt)
return y
我把字典列表的嵌套字典放进去,
我弄得一团糟,即没有像我想象的那样工作。
{'sections': [{'id': 11, 'info': 'This is section ONE', 'tag': 's1'},
{'fields': [{'id': 15,
'info': 'This is field ONE',
'tag': 'f1'},
{'elements': [{'id': 20,
'info': 'This is element',
'tag': 'e1',
'type_of': 'text_field'},
{'id': 20,
'info': 'This is element',
'tag': 'e2',
'type_of': 'text_field'},
{'id': 20,
'info': 'This is element',
'tag': 'e3',
'type_of': 'text_field'},
{'id': 20,
'info': 'This is element',
'tag': 'e4',
'type_of': 'text_field'}],
'id': 16,
'info': 'This is field TWO',
'tag': 'f2'},
{'elements': [{'id': 20,
'info': 'This is element',
'tag': 'e5',
'type_of': 'text_field'},
{'id': 20,
'info': 'This is element',
'tag': 'e6',
'type_of': 'text_field'},
{'id': 20,
'info': 'This is element',
'tag': 'e7',
'type_of': 'text_field'},
{'id': 20,
'info': 'This is element ONE',
'tag': 'e8',
'type_of': 'text_field'}],
'id': 16,
'info': 'This is field THREE',
'tag': 'f3'}],
'id': 12,
'info': 'This is section TWO',
'tag': 's2'},
{'fields': [{'id': 15,
'info': 'This is field FOUR',
'tag': 'f4'},
{'id': 15,
'info': 'This is field FIVE',
'tag': 'f5'},
{'id': 15,
'info': 'This is field SIX',
'tag': 'f6'}],
'id': 12,
'info': 'This is section THREE',
'tag': 's3'}],
'tag': 'test'}
我想要发生的是,第一级的所有项目都被编号,然后第二级的所有项目都被编号,然后是第三级,然后是第四级。在这种情况下,主要项目的 id 应为 1,然后将部分标识为 2、3、4,然后将字段标识为 5,然后是元素等。在睡觉后回头看,我可以将其视为开始,但完全错误。
编辑:我真正需要做的是从嵌套字典结构创建父/子节点树,以便我可以根据需要迭代/插入/获取/使用该树中的项目。有没有快速的方法来做到这一点?我的工作似乎比我预期的要多。
EDIT2:我找到了original question 的解决方案。我只是决定使用内置的 id() 函数而不是添加 id 的额外步骤,并且能够创建我需要的最小树,但这仍然是一个有用的练习。
【问题讨论】:
-
在最初的问题中,有人问你想要什么输出,你说你想“编辑东西”。在这里,您需要“父/子节点树”,但树不是具体的数据结构。您的原始数据已经是作为字典列表实现的父/子节点树 - 您是否想要具有更少字段的相同列表结构,或者您是否希望您的树成为列表列表,或者你想要一个扁平的轮廓:(1 a,1.1 b,1.1.1 c,1.2 d,...)?请从给定的输入中发布您想要的输出。
-
嗯,这是对我想要完成的目标不断发展的理解。我有4个数据库模型A,B,C,D。B属于A,C属于B等。我需要通过这个嵌套结构创建A,然后创建B并添加到A,然后创建C并添加到相应的B等等等等。我需要遍历该结构并将每个节点及其与父/子的关系隔离在一个临时结构中,我可以引用该结构以分层方式说“创建这个对象,附加这个另一个对象”。而且我还没有找到一种简单的方法,也许对其他人来说很明显,但我只是在尝试不同的方法。
标签: python dictionary tree loops