python实现无限分类的数据结构

数据准备

 

      city:[
        {'cat_id':3,'name':'河北省','parent_id':0},
        {'cat_id':4,'name':'邯郸','parent_id':1},
        {'cat_id':7,'name':'魏县','parent_id':2},
        {'cat_id':2,'name':'保定','parent_id':1},
        {'cat_id':5,'name':'河南省','parent_id':0},
        {'cat_id':9,'name':'安阳','parent_id':1},
      ],

需求

获取以下分类数据结构

'''

河北省

-邯郸

--魏县

-保定

河南省

-安阳

'''

 河北省为一级分类,parent_id为0,邯郸是河北省的子分类,魏县是邯郸的子分类,以此类推

实现

方式一:递归实现

res_id=[]
#parent_id 就是你点击的分类的id,找这个分类下的所有子分类。
def get_son_id_list(data,parent_id,is_clear=True):
    #第一次走的时候就会进入这个if
    if is_clear:
        res_id.clear()
        #如果parent_id不等与0,就把自己加进去,因为等于0的时候,下面的逻辑会加
        if parent_id:
            res_id.append(parent_id)
    for item in data:
        #如果该分类的父级id为传过的parent_id,就把它的cat_id,存到res_id,接着找它自己有没有儿子,进行递归,是0的时候就代表是一个一级分类,也能满足,直接加进去。
        if item['parent_id']==parent_id:
            res_id.append(item['cat_id'])
            #开始递归,data还是原来的data,parent改成当前的分类id,找子子孙孙
            get_son_id_list(data,parent_id=item["cat_id"],
            is_clear=False)
    return res_id
#最后返回的是一个存放id的列表,根据这个列表里面的id,去查找在这些分类下的商品

方式二实现:

def get_tree(data):
    #先定义一个空列表和空字典
    lists=[]
    tree={}
    #循环传进来的列表套字典
    for item in data:
        #把所有的分类的id和分类字典以键值对的形式存进这个空字典
        tree[item['cat_id']]=item
    #再次开始循环这个列表
    for i in data:
        #如果当前的分类的父分类是0
        if not i['parent_id']:
            #就直接把这个分类的id存进空列表
            lists.append(tree[i['cat_id']])
        else:
            #如果不是0的话,就把他的父分类的id复制给parent_id
            parent_id=i['parent_id']
            #给没有'children'的父类添加一个
            if "children" not in tree[parent_id]:
                tree[parent_id]["children"]=[]
            #然后把当前分类的id,存到他的父分类的children里面。
            tree[parent_id]['children'].append(tree[i['cat_id']])

    return lists

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值