将字典列表转换为树

Convert list-of-dicts into 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'}
]`

作为信息,我们知道顶层 (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':[]}]
}]`

以下代码:

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'}