根據id和parent_id二維樹形結構數據生成嵌套樹形結構數據

一、原數據

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 裏

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章