分类的数据处理 第一种递归处理,第二种树的形式

数据格式:
data=[
    {"cat_id":3,"name":"青浦","parent_id":1},
    {"cat_id": 2, "name": "张江", "parent_id": 4},
    {"cat_id":4,"name":"浦东","parent_id":1},
    {"cat_id":5, "name": "北京", "parent_id": 0},
    {"cat_id":6, "name": "昌平", "parent_id": 5},
    {"cat_id": 1, "name": "上海", "parent_id": 0},
]
第一种处理(递归):
将数据如下输出:
上海
-青浦
-浦东
--张江
北京
-昌平
````
代码如下:

res = []
def get_son(data,level = 0,parent_id = 0 ):
    for item in data:
        if item[‘parent_id‘] == parent_id :
            item[‘level‘] =level
            res.append(item)
            get_son(data,level+1,item[‘cat_id‘])

    return res

代码的执行过程
‘‘‘
1 p=0,l=0
    北京 c = 5,找北京的儿子,p =5 l=0+1
        昌平 c =6 ,找昌平的儿子 ,p=6 l =1+1
    上海 c =1 ,找上海的儿子 ,p=1 l=0+1
        青浦 c=3 找青浦的儿子 p=3 l = 1+1
        "浦东" cat_id":4 找浦东的儿子,p=4 l=1+1
           张江 c = 2 找张江的儿子  p=2 l=l+1+1
‘‘‘

第二种树的行式:
需求如下:
讲data 数据变成data1
data1 = [
    {
        "cat_id": 1, "name": "上海", "parent_id": 0,
        "children":[
            {"cat_id":3,"name":"青浦","parent_id":1},
            {"cat_id": 4, "name": "浦东", "parent_id": 1,"children":
                [{"cat_id": 2, "name": "张江", "parent_id": 4},]},

        ]
     },
    {"cat_id": 5, "name": "北京", "parent_id": 0,"children":[]},

]

这样就可以通过循环嵌套的级数显示几级分类。
for item in data1:
    print("一级分类:",item[‘name‘])
    for item1 in item["children"]:
        print("二级分类:",item1.get(‘name‘))

代码如下:
def get_tree(data):
    #lists = [{"cat_id":5, "name": "北京", "parent_id": 0,"children":[]},{"cat_id": 1, "name": "上海", "parent_id": 0}]
    lists= []
    tree = {}
    for i in data:
        tree[i["cat_id"]] = i    # {3:{"cat_id":3,"name":"青浦","parent_id":1},...}
    for item in data:
        if item[‘parent_id‘] == 0:    # 说明它为根节点
            lists.append(tree[item[‘cat_id‘]])    # 插入根节点的字典
        else:
            if "children" not in tree[item["parent_id"]]:    # 判断每一个父类字典有没有children的key
                tree[item[‘parent_id‘]][‘children‘] = []    # 添加children的空值key
            tree[item[‘parent_id‘]][‘children‘].append(tree[item[‘cat_id‘]])    # 把儿子对象添加进去

    return  lists

原文地址:https://www.cnblogs.com/ludingchao/p/12507568.html

时间: 2024-12-25 07:16:37

分类的数据处理 第一种递归处理,第二种树的形式的相关文章

Eclipse 常用技巧 第一种:直接复制法 解决方法是: 第二种:使用link文

快捷方式 0. Ctrl + 1 (快速修复) 1. Ctrl + D (删除当前行) 2. Ctrl + Alt + ↓(复制当前行到下一行) 3. Alt + / 或者说是 Ctrl + 空格(由于后者与输入法的快捷键冲突,所以,我一般都用前者) 作用:快速插入. 4. Alt+Shift+R 重命名非常好用. 5. Ctrl + Q 定位到最后编辑的地方. 6. Ctrl + Shift + O 自动导入包. 7. Ctrl+/ 注释当前行,再按则取消注释. 8. Ctrl+K快速查找.

二叉树的几种递归和非递归式遍历:

#include <fstream>#include <iostream> using namespace std; /* 后序遍历的非递归实现是三种遍历方式中最难的一种.因为在后序遍历中,要保证左孩子和右孩子都已被访问并且左孩子在右孩子前访问才能访问根结点,这就为流程的控制带来了难题.下面介绍两种思路. 第一种思路:对于任一结点P,将其入栈,然后沿其左子树一直往下搜索,直到搜索到没有左孩子的结点,此时该结点出现在栈顶,但是此时不能将其出栈并访问,因此其右孩子还为被访问.所以接下来

Unity 人物跟谁手指的移动(第一种方式)

长夜漫漫无心睡眠,敲敲代码,越敲越来劲! 我发现好多小朋友都在玩熊出没之xxxx这个游戏,居然打了一下午都没玩通第2关,我把测试也叫来陪我一起玩! 结果他也打不通,我再去叫策划,他也没打过,我去叫主管,他还是没打过,我再回去叫测试使用游戏修改大师,修改宝石买完全部的装备!结果他还是没打过! (这款游戏,让我人生都变得没有了意义!) 人物跟随手指的移动而移动: 第一种方式: 手指移动了多少,主角就移动多少!(我使用的这种方式,存在问题,手指过快滑动,主角会慢慢跟手指有了距离!) 第二种方式: 手指

第一种:NStread

1 - (void)viewDidLoad { 2 [super viewDidLoad]; 3 // Do any additional setup after loading the view, typically from a nib. 4 5 /** 6 * 实现多线程方式之一:NSThread 7 */ 8 /* 9 // 获取当前线程 10 NSLog(@"current = %@", [NSThread currentThread]); 11 // 获取主线程 12 NS

用两种递归思路与循环实现单链表的反转

typedef struct ListNode{ int data; struct ListNode *next; }ListNode; //递归一 ListNode *ReverseList (ListNode *pHead, ListNode *nHead = NULL) { //每次取下第一个节点头插法创建新链表 //nHead为反转后链表的头节点 if(pHead == NULL) return NULL; ListNode *pNext = pHead -> next; pHead -

C#导入Excel 三种方式,64位机器不支持第一种

本文来源于网络搜集,如有不合适之处,请留言. 第一种方式: 通过OleDB方式获取Excel文件的数据,然后通过DataSet中转到SQL Server,这种方法的优点是非常的灵活,可以对Excel表中的各个单元格进行用户所需的操作. string connExcel = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties=Excel 8.0"; 第二种

Android的Frangment的第一种声明方式

Android的Frangment的第一种声明方式 实际效果图如下: 项目结构图如下: fragment1: package com.demo.fragementfirst; import android.content.Context; import android.net.Uri; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nul

Core CLR 自定义的Host官方推荐的一种形式(第一种)

.Net Core CLR提供两种Host API访问 托管代码的形式,按照微软官方的说法,一种是通过CoreClr.DLL来直接调用托管生成的DLL程序集,另外一种是通过CoreClr里面的C导出函数GetCLRRuntimeHost获取到IID_ICLRRuntimeHost4然后访问托管代码. 其实这两种形式可以合二为一,第一种更简单,更方便的控制托管代码.第二种更灵活些,在一些老旧的主机上会用到这些代码,实际上第一种形式是扩充了第二种访问形式,进行了一个整体封装,原理上其实还是一样的.

php处理无限极分类数据的两种方式

开发过程中,经常会遇到处理无限分类数据,这里就介绍一下处理无限分类数据的两种方式,有不对的地方,还望多多指正. //测试数据 $array=array( ['id'=>1,'parent_id'=>0,'name'=>1], ['id'=>2,'parent_id'=>0,'name'=>2], ['id'=>3,'parent_id'=>1,'name'=>3], ['id'=>4,'parent_id'=>1,'name'=>4]