一、原数据
data = [
{'id': 10,'parent_id': 8, 'name': "ACAB"},
{'id': 9, 'parent_id': 8, 'name': "ACAA"},
{'id': 8, 'parent_id': 7, 'name': "ACA"},
{'id': 7, 'parent_id': 1, 'name': "AC"},
{'id': 6, 'parent_id': 3, 'name': "ABC"},
{'id': 5, 'parent_id': 3, 'name': "ABB"},
{'id': 4, 'parent_id': 3, 'name': "ABA"},
{'id': 3, 'parent_id': 1, 'name': "AB"},
{'id': 2, 'parent_id': 0, 'name': "AA"},
{'id': 1, 'parent_id': 0, 'name': "A"},
]
二、原理:利用对象内存共享生成嵌套结构
三、python实现
def list_to_tree(data):
res = {}
for v in data:
# v["parent_id"] = v["parent_id"] if v["parent_id"] else 0
# 以id为key,存储当前元素数据
res.setdefault(v["id"], v).update(v) # .update(v) 解决先添加parent_id,后添加id的情况。
# 这里默认的关联关系,v的内存地址是一致的,所以后续修改之后,关联的结构数据也会变化。
res.setdefault(v["parent_id"], {}).setdefault("children", []).append(res.get(v["id"], v))
return res[0]["children"]
可以打印下list_to_tree内 res的值,理解一下实现思路
[
{
"id": 1,
"parent_id": 0,
"name": "A",
"children": [
{
"id": 3,
"parent_id": 1,
"name": "AB",
"children": [
{
"id": 4,
"parent_id": 3,
"name": "ABA"
},
{
"id": 5,
"parent_id": 3,
"name": "ABB"
},
{
"id": 6,
"parent_id": 3,
"name": "ABC"
}
]
},
{
"id": 7,
"parent_id": 1,
"name": "AC",
"children": [
{
"id": 8,
"parent_id": 7,
"name": "ACA",
"children": [
{
"id": 9,
"parent_id": 8,
"name": "ACAA"
},
{
"id": 10,
"parent_id": 8,
"name": "ACAB"
}
]
}
]
}
]
},
{
"id": 2,
"parent_id": 0,
"name": "AA"
}
]
参考地址:https://blog.youkuaiyun.com/p1049990866/article/details/96615017
Python 字典 setdefault() 方法
描述
Python 字典 setdefault() 方法和 get()方法 类似。不同之处:如果键不已经存在于字典中,将会添加键并将值设为默认值。
语法
setdefault()方法语法:
dict.setdefault(key, default=None)
参数
- key – 查找的键值。
- default – 键不存在时,设置的默认键值。
返回值
如果 key 在 字典中,返回对应的值。如果不在字典中,则插入 key 及设置的默认值 default,并返回 default ,default 默认值为 None。
效率
使用setfault
只需要进行一次查询.,对于先判断在不在再增加更高效一些
使用
>>> di = {}
>>>
>>>
>>> di.setdefault("parent_id", {}).setdefault("children", [])
[]
>>>
>>> di
{
'parent_id': {
'children': []
}
}
参考地址:
https://blog.youkuaiyun.com/haiyanggeng/article/details/82710315
https://www.runoob.com/python3/python3-att-dictionary-setdefault.html
Python 字典 update() 方法
把字典参数 dict2 的 key/value(键/值) 对更新到字典 dict 里