python3無限級分類的兩種實現方式(遞迴和非遞迴)
阿新 • • 發佈:2020-12-26
非遞迴方式
import json def format(data): print(json.dumps(data, indent=4, ensure_ascii=False, sort_keys=False, separators=(',', ':'))) def getTree(menu_list): # 處理資料 menu_map = {} for item in menu_list: item["child"] = [] menu_map[item["id"]] = item tree = [] for item in menu_map.values(): if menu_map.get(item["pid"]): # 找兒子 menu_map[item["pid"]]["child"].append(item) else: # 找出所有的頂級 tree.append(item) return tree if __name__ == '__main__': menu_list = [ { "id": 1, "pid": 0, "name": "top1" }, { "id": 2, "pid": 0, "name": "top2" }, { "id": 3, "pid": 1, "name": "top1-sub1" }, { "id": 4, "pid": 1, "name": "top1-sub2" }, { "id": 5, "pid": 3, "name": "top1-sub1-sub1" }, { "id": 6, "pid": 2, "name": "top2-sub1" }, ] format(getTree(menu_list))
遞迴方式
import json def format(data): print(json.dumps(data, indent=4, ensure_ascii=False, sort_keys=False, separators=(',', ':'))) # 父親找兒子 def getTree(menu_list,pid): tree = [] for item in menu_list: if item["pid"] == pid: item["child"] = getTree(menu_list, item["id"]) # 找兒子的過程 tree.append(item) return tree if __name__ == '__main__': menu_list = [ { "id": 1, "pid": 0, "name": "top1" }, { "id": 2, "pid": 0, "name": "top2" }, { "id": 3, "pid": 1, "name": "top1-sub1" }, { "id": 4, "pid": 1, "name": "top1-sub2" }, { "id": 5, "pid": 3, "name": "top1-sub1-sub1" }, { "id": 6, "pid": 2, "name": "top2-sub1" }, ] format(getTree(menu_list,0))