将list-of-dicts转换为树

时间:2015-05-04 06:00:11

标签: python list tree categories nested-lists

两天后,我尝试将一个dicts列表遍历到树中。

`list_of_dicts = [
{'name':Category1, 'id': '7', 'parent_id': '7', 'level': '1'}
{'name':Category3, 'id': '33', 'parent_id': '7', 'level': '2'}
{'name':Category5, 'id': '334', 'parent_id': '33', 'level': '3'}
{'name':Category10, 'id': '23', 'parent_id': '7', 'level': '2'}
{'name':Category2, 'id': '8', 'parent_id': '8', 'level': '1'}
{'name':Category6, 'id': '24', 'parent_id': '8', 'level': '2'}
]`

作为信息,我们知道顶级(1)上的类别,它有自己的id作为其parent_id,子节点的父节点的id为parent_id和级别。

在第一步中,列表需要像树一样转入:

`traversed_list = [
{'name':Category1, 'id': '7', 'parent_id': '7', 'level': '1',      'children':
[
{'name':Category3, 'id': '33', 'parent_id': '7', 'level': '2', 'children': [
{'name':Category5, 'id': '334', 'parent_id': '33', 'level': '3', 'children':[]}]}
{'name':Category10, 'id': '23', 'parent_id': '7', 'level': '2', 'children':[]}
]}
{'name':Category2, 'id': '8', 'parent_id': '8', 'level': '1', 'children':
[{'name':Category6, 'id': '24', 'parent_id': '8', 'level': '2', 'children':[]}]
}]`

1 个答案:

答案 0 :(得分:1)

以下代码:

import copy

def treeify(lst):
  tree = [copy.deepcopy(cat) for cat in lst if cat['level'] == '1']
  for el in tree:
    el["children"] = []
  for i in xrange(len(lst)):
    for j in xrange(len(tree)):
      if lst[i]["parent_id"] == tree[j]["id"]:
        tree[j]["children"].append(copy.deepcopy(lst[i]))
  return tree

list_of_dicts = [
  {'name':"Category1", 'id': '7', 'parent_id': '7', 'level': '1'},
  {'name':"Category3", 'id': '33', 'parent_id': '7', 'level': '2'},
  {'name':"Category5", 'id': '334', 'parent_id': '33', 'level': '3'},
  {'name':"Category10", 'id': '23', 'parent_id': '7', 'level': '2'},
  {'name':"Category2", 'id': '8', 'parent_id': '8', 'level': '1'},
  {'name':"Category6", 'id': '24', 'parent_id': '8', 'level': '2'}
]

tree = treeify(list_of_dicts)
for d in tree:
  print d

打印

{'id': '7', 'parent_id': '7', 'children': [{'id': '7', 'parent_id': '7', 'name': 'Category1', 'level': '1'}, {'id': '33', 'parent_id': '7', 'name': 'Category3', 'level': '2'}, {'id': '23', 'parent_id': '7', 'name': 'Category10', 'level': '2'}], 'name': 'Category1', 'level': '1'}
{'id': '8', 'parent_id': '8', 'children': [{'id': '8', 'parent_id': '8', 'name': 'Category2', 'level': '1'}, {'id': '24', 'parent_id': '8', 'name': 'Category6', 'level': '2'}], 'name': 'Category2', 'level': '1'}