Python实现无线分类的数据结构
数据准备:
data = [
{'cat_id':3,'name':'沙河','parent_id':1},
{"cat_id":4,"name":"sb镇","parent_id":3},
{"cat_id":1, "name": "北京", "parent_id": 0},
{"cat_id":5,"name":"昌平","parent_id":1},
{"cat_id":6,"name":"青浦","parent_id":2},
{"cat_id":2, "name": "上海", "parent_id": 0},
]
需求:
获得以下分类数据结构形式
'''
北京
-沙河
--sb镇
-昌平
上海
-青浦
'''
分析:
北京市一级分类,parent_id无,所有拥有parent_id为1的分类是北京市的子分类也是二级分类...sb镇又是沙河的子分类,属于三级分类,以此类推...
实现:
方式一递归实现
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