根据id和parent_id二维树形结构数据生成嵌套树形结构数据

一、原数据

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.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 里

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页