一、原數據
data = [
{'id': 1, 'parent_id': 0, 'name': "A"},
{'id': 2, 'parent_id': 0, 'name': "AA"},
{'id': 3, 'parent_id': 1, 'name': "AB"},
{'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"},
{'id': 8, 'parent_id': 7, 'name': "ACA"},
{'id': 9, 'parent_id': 8, 'name': "ACAA"},
{'id': 10,'parent_id': 8, 'name': "ACAB"},
]
二、原理:利用對象內存共享生成嵌套結構
三、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(v)
return res[0]["children"]
如上需要對數據順序有要求,如下優化
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"},
]
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)
for v in data:
res.setdefault(v["parent_id"], {}).setdefault("children", []).append(v)
# 這裏默認的關聯關係,v的內存地址是一致的,所以後續修改只後,關聯的結構也會變化。
return res[0]["children"]
ret = list_to_tree(data)
可以打印下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.csdn.net/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.csdn.net/haiyanggeng/article/details/82710315
https://www.runoob.com/python3/python3-att-dictionary-setdefault.html
Python 字典 update() 方法
把字典參數 dict2 的 key/value(鍵/值) 對更新到字典 dict 裏