1. 程式人生 > 實用技巧 >python3無限級分類的兩種實現方式(遞迴和非遞迴)

python3無限級分類的兩種實現方式(遞迴和非遞迴)

非遞迴方式

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))