zoukankan      html  css  js  c++  java
  • 递归分类和树形式分类

    无限极分类实现

    数据准备

    data=[
        {"cat_id":1,"name":"安徽","parent_id":0},
        {"cat_id":2,"name":"福建","parent_id":0},
        {"cat_id":3,"name":"阜阳","parent_id":1},
        {"cat_id":4,"name":"亳州","parent_id":1},
        {"cat_id":5,"name":"马鞍山","parent_id":1},
        {"cat_id":6,"name":"临泉","parent_id":3},
        {"cat_id":7,"name":"阜南","parent_id":3},
        {"cat_id":8,"name":"界首","parent_id":3},
        {"cat_id":9,"name":"太和","parent_id":3},
        {"cat_id":10,"name":"涡阳","parent_id":4},
        {"cat_id":11,"name":"利辛","parent_id":4},
        {"cat_id":12,"name":"花山区","parent_id":5},
        {"cat_id":13,"name":"雨山区","parent_id":5},
        {"cat_id":14,"name":"厦门","parent_id":2},
        {"cat_id":15,"name":"莆田","parent_id":2},
        {"cat_id":16,"name":"湖里区","parent_id":14},
        {"cat_id":17,"name":"思明区","parent_id":14},
        {"cat_id":18,"name":"思明区","parent_id":14},
        {"cat_id":19,"name":"集美区","parent_id":14},
        {"cat_id":20,"name":"同安区","parent_id":14},
        {"cat_id":21,"name":"翔安区","parent_id":14},
        {"cat_id":22,"name":"仙游县","parent_id":15},
        {"cat_id":23,"name":"莆田市区","parent_id":15},
        {"cat_id":24,"name":"庙岔镇","parent_id":6},
        {"cat_id":25,"name":"滑集镇","parent_id":6},
        {"cat_id":26,"name":"集美街道","parent_id":19},
        {"cat_id":27,"name":"马巷","parent_id":21},
    ]
    

    无限极递归分类

    每查找到一个子集,就会递归调用自身,去找自己的子集,重新使用for循环遍历一次;知道没有子集,开始回溯,效率低下。分类好的数据全部排序在一张列表,没有具体区分归属,使用时相当不便。

    res=[]
    def get_son(data,level=0,parent_id=0,is_clear=True):
        if is_clear:
            res.clear()
        for item in data:
            if item['parent_id']==parent_id:
                item['level']=level
                res.append(item)
                get_son(data,level=level+1,parent_id=item['cat_id'],is_clear=False)
        return res
     
    print(get_son(data))
    

    运行结果:

    '''
    [
    {'cat_id': 1, 'name': '安徽', 'parent_id': 0, 'level': 0},
    {'cat_id': 3, 'name': '阜阳', 'parent_id': 1, 'level': 1},
    {'cat_id': 6, 'name': '临泉', 'parent_id': 3, 'level': 2}, 
    {'cat_id': 24, 'name': '庙岔镇', 'parent_id': 6, 'level': 3}, 
    {'cat_id': 25, 'name': '滑集镇', 'parent_id': 6, 'level': 3}, 
    {'cat_id': 7, 'name': '阜南', 'parent_id': 3, 'level': 2},
    {'cat_id': 8, 'name': '界首', 'parent_id': 3, 'level': 2},
    {'cat_id': 9, 'name': '太和', 'parent_id': 3, 'level': 2},
    {'cat_id': 4, 'name': '亳州', 'parent_id': 1, 'level': 1},
    {'cat_id': 10, 'name': '涡阳', 'parent_id': 4, 'level': 2}, 
    {'cat_id': 11, 'name': '利辛', 'parent_id': 4, 'level': 2}, 
    {'cat_id': 5, 'name': '马鞍山', 'parent_id': 1, 'level': 1},
    {'cat_id': 12, 'name': '花山区', 'parent_id': 5, 'level': 2},
    {'cat_id': 13, 'name': '雨山区', 'parent_id': 5, 'level': 2},
    {'cat_id': 2, 'name': '福建', 'parent_id': 0, 'level': 0}, 
    {'cat_id': 14, 'name': '厦门', 'parent_id': 2, 'level': 1}, 
    {'cat_id': 16, 'name': '湖里区', 'parent_id': 14, 'level': 2},
    {'cat_id': 17, 'name': '思明区', 'parent_id': 14, 'level': 2},
    {'cat_id': 18, 'name': '思明区', 'parent_id': 14, 'level': 2},
    {'cat_id': 19, 'name': '集美区', 'parent_id': 14, 'level': 2},
    {'cat_id': 26, 'name': '集美街道', 'parent_id': 19, 'level': 3},
    {'cat_id': 20, 'name': '同安区', 'parent_id': 14, 'level': 2}, 
    {'cat_id': 21, 'name': '翔安区', 'parent_id': 14, 'level': 2}, 
    {'cat_id': 27, 'name': '马巷', 'parent_id': 21, 'level': 3},
    {'cat_id': 15, 'name': '莆田', 'parent_id': 2, 'level': 1},
    {'cat_id': 22, 'name': '仙游县', 'parent_id': 15, 'level': 2},
     {'cat_id': 23, 'name': '莆田市区', 'parent_id': 15, 'level': 2}
     ]
    '''
    

    无限极树形式的分类

    两次for循环:

    第一次根据每个字典中的分类id(cat_id),重新根据key(cat_id) =value(原字典)的形式组装并放到新列表(tree)中, ;

    第二次for循环,将所有子分类添加到所属的父分类中

    def get_tree(data):
        lists=[]
        tree={}
        for i in data:
            # 将原data字典中每个字典根据每个字典中的cat_id作为键,每个字典作为值,添加到定义的tree字典中。
            tree[i['cat_id']]=i
        print(tree)
        for item in data:
            # 如果item中的parent_id 为0 ,添加到lists中
            if not item['parent_id']:
                lists.append(tree[item['cat_id']])
            else:
                # for循环出来的item的父亲字典中(通过parent_id判断他所属的父亲)如果没有children这个键
                if "children" not in tree[item['parent_id']]:
                    # 在tree的子字典中添加一个键值对,键是children,值是空列表
                    tree[item['parent_id']]['children']=[]
                # 如果有children这个键,直接根据parent_id判断其所属的父亲字典,并添加到父亲字典的children对应的列表中。
                tree[item['parent_id']]['children'].append(tree[item['cat_id']])  # # tree[item['cat_id']] = item
        return lists
    
    print(get_tree(data))
    

    打印结果:

    print(tree)

    
    '''
    {
    1: {'cat_id': 1, 'name': '安徽', 'parent_id': 0},
    2: {'cat_id': 2, 'name': '福建', 'parent_id': 0}, 
    3: {'cat_id': 3, 'name': '阜阳', 'parent_id': 1}, 
    4: {'cat_id': 4, 'name': '亳州', 'parent_id': 1}, 
    5: {'cat_id': 5, 'name': '马鞍山', 'parent_id': 1}, 
    6: {'cat_id': 6, 'name': '临泉', 'parent_id': 3}, 
    7: {'cat_id': 7, 'name': '阜南', 'parent_id': 3}, 
    8: {'cat_id': 8, 'name': '界首', 'parent_id': 3},
    9: {'cat_id': 9, 'name': '太和', 'parent_id': 3}, 
    10: {'cat_id': 10, 'name': '涡阳', 'parent_id': 4},
    11: {'cat_id': 11, 'name': '利辛', 'parent_id': 4},
    12: {'cat_id': 12, 'name': '花山区', 'parent_id': 5},
    13: {'cat_id': 13, 'name': '雨山区', 'parent_id': 5},
    14: {'cat_id': 14, 'name': '厦门', 'parent_id': 2}, 
    15: {'cat_id': 15, 'name': '莆田', 'parent_id': 2}, 
    16: {'cat_id': 16, 'name': '湖里区', 'parent_id': 14},
    17: {'cat_id': 17, 'name': '思明区', 'parent_id': 14},
    18: {'cat_id': 18, 'name': '思明区', 'parent_id': 14}, 
    19: {'cat_id': 19, 'name': '集美区', 'parent_id': 14}, 
    20: {'cat_id': 20, 'name': '同安区', 'parent_id': 14}, 
    21: {'cat_id': 21, 'name': '翔安区', 'parent_id': 14},
    22: {'cat_id': 22, 'name': '仙游县', 'parent_id': 15}, 
    23: {'cat_id': 23, 'name': '莆田市区', 'parent_id': 15}, 
    24: {'cat_id': 24, 'name': '庙岔镇', 'parent_id': 6},
    25: {'cat_id': 25, 'name': '滑集镇', 'parent_id': 6}, 
    26: {'cat_id': 26, 'name': '集美街道', 'parent_id': 19},
    27: {'cat_id': 27, 'name': '马巷', 'parent_id': 21},
    }
    
    '''
    

    print(get_tree(data))

    '''
    [{'cat_id': 1, 'name': '安徽', 'parent_id': 0, 
    'children': [{'cat_id': 3, 'name': '阜阳', 'parent_id': 1, 
    'children': [{'cat_id': 6, 'name': '临泉', 'parent_id': 3, 
    'children': [{'cat_id': 24, 'name': '庙岔镇', 'parent_id': 6}, 
    {'cat_id': 25, 'name': '滑集镇', 'parent_id': 6}]}, 
    
    {'cat_id': 7, 'name': '阜南', 'parent_id': 3}, 
    {'cat_id': 8, 'name': '界首', 'parent_id': 3}, 
    {'cat_id': 9, 'name': '太和', 'parent_id': 3}]}, 
    
    {'cat_id': 4, 'name': '亳州', 'parent_id': 1,
    'children': [{'cat_id': 10, 'name': '涡阳', 'parent_id': 4}, 
    {'cat_id': 11, 'name': '利辛', 'parent_id': 4}]}, 
    {'cat_id': 5, 'name': '马鞍山', 'parent_id': 1, 
    'children': [{'cat_id': 12, 'name': '花山区', 'parent_id': 5}, 
    {'cat_id': 13, 'name': '雨山区', 'parent_id': 5}]}]}, 
    
    {'cat_id': 2, 'name': '福建', 'parent_id': 0,
    'children': [{'cat_id': 14, 'name': '厦门', 'parent_id': 2,
    'children': [{'cat_id': 16, 'name': '湖里区', 'parent_id': 14},
    {'cat_id': 17, 'name': '思明区', 'parent_id': 14}, 
    {'cat_id': 18, 'name': '思明区', 'parent_id': 14}, 
    {'cat_id': 19, 'name': '集美区', 'parent_id': 14,
    'children': [{'cat_id': 26, 'name': '集美街道', 'parent_id': 19}]},
    
    {'cat_id': 20, 'name': '同安区', 'parent_id': 14},
    {'cat_id': 21, 'name': '翔安区', 'parent_id': 14, 
    'children': [{'cat_id': 27, 'name': '马巷', 'parent_id': 21}]}]},
    {'cat_id': 15, 'name': '莆田', 'parent_id': 2, 
    'children': [{'cat_id': 22, 'name': '仙游县', 
    'parent_id': 15}, {'cat_id': 23, 'name': '莆田市区', 'parent_id': 15}]}]}]
    
    '''
    
  • 相关阅读:
    很不错的WebCart控件,分享给大家
    Atitit 功能扩展法细则条例 目录 1. 界面ui扩展 2 1.1. 使用h5做界面 2 1.2. 自制h5 ide。。简化ui自定义配置 2 2. 业务逻辑扩展 2 2.1. Bpm流程引擎还
    Atitit 持久化与数据存储标准化规范 目录 1. 存储的附加功能 2 1.1. 基本存取功能 2 1.2. 全文检索(imap 2 1.3. 属性检索 2 1.4. 查询语言 2 2. 基于内容
    Atitit 常见硬件集成列表 目录 1.1. 小程序设备类 1 1.2. atitit.常见手机的传感器与外设 attilax总结 1 1.3. Pc机外设 1 1.4. 设备管理器 2 1.1
    Atitit 项目wechat微信截屏生成vcf通讯录384 个 384个人 42个节拍,平均每个8个人 技术点 im图像裁剪, ocr Tesseract Vcf格式 /wechatTel
    atitit 音频 项目 系列功能表 音乐 v3 t67.docx Atitit 音频 项目 系列功能表 音频 音乐 语言领域的功能表 听歌识曲功能 酷我功能。 铃声 功能。。 音频切割(按照副歌部
    Atitit spring springboot 集成mybatis法 目录 1.1. 使用spring管理数据源。。需要修改spring、 配置 1 1.2. 直接代码集成,无需修改任何配置 1
    Atitit 艾提拉音频资源列表与统计 t6 六月份战果与7月份规划.docx 目录 1. 第一层次 原始资源类 采集资源类 1 1.1. K歌类采集资源 整理 1 1.2. K歌类资源初步分类
    Atitit 长距离无线通信法 LoRa NBIoT NBCIoT LoRa是Semtech公司的创新发明,该技术向用户提供显著的长距离、低功耗、安全数据传输机制。使用LoRa技术构建的公用网
    Atitit 读取音频音乐文件的bpm 目录 1.1. Librosa是一个用于音频、音乐分析、处理的python工具包, 1 1.2. \bpm.py 1 1.3. Echo 2 1.4. Cod
  • 原文地址:https://www.cnblogs.com/zhangchaocoming/p/13168879.html
Copyright © 2011-2022 走看看