一:父子分类
'''
父子分类效果
1北京 0
2-海淀1
4--sb镇2
-昌平
3 上海 0
-青浦
--徐泾镇
-闵行
'''
data_dict = [
{"category_id": 1, "name": "北京", "parent_id": 0},
{"category_id": 2, "name": "上海", "parent_id": 0},
{"category_id": 3, "name": "沙河", "parent_id": 1},
{"category_id": 4, "name": "sb镇", "parent_id": 3},
{"category_id": 5, "name": "昌平", "parent_id": 1},
{"category_id": 6, "name": "青浦", "parent_id": 2},
]
res_list = []
def func(data_list, parent_id=0, level=0, is_clear=True):
'''
:param data_list: 需要排序的数据
:param parent_id: 自关联的父id 默认0是属于父类
:param level: 显示排序的层级 默认0位第一层级
:return:
'''
if is_clear: # 防止每次循环每次还有以前残留的数据
res_list.clear()
for data in data_list: # 循环打印获取数据
# 首先判断是不是父类
if data['parent_id'] == parent_id:
# 如果为父类显示层级为第一级
data['level'] = level
# 将该循环的数据加入上述字典
res_list.append(data)
# 循环第二层 ..
# 第二层肯定是在上一层 + 1 但是parent_id是无序的 但是其肯定属于某个分类
func(data_list, level=level + 1, parent_id=data['category_id'], is_clear=False)
return res_list
res = func(data_dict)
for i in res:
print("-" * i['level'] + i['name'])
二:无限分类
def func1(data_list):
res_data = [] # 定义一个返回的列表的 所有数据存入该列表
tree = {} # 无限分类 类似于一个树为根节点 一个根节点 有很多支点 类似于字典
for i in data_list:
tree[i['category_id']] = i # 给循环的数据加个id 作为标记记录
for data in data_list:
# 判断是不是根节点
if not data['parent_id']:
# 如果不是根节点 将其加入某个分类节点下
res_data.append(tree[data['category_id']])
else:
# 如果是根节点 判断是否有子节点
if "children" not in tree[data['parent_id']]: # 如果没有子节点 添加子节点
tree[data['parent_id']]['children'] = [] # 添加个子节点
tree[data['parent_id']]['children'].append(tree[data['category_id']]) # 将子节点加入到某个分类下
return res_data
PS:此类的数据都是参照上述父子分类里的data_dict