Python 字典相关的笔试题(二)

2021年09月15日 阅读数:1
这篇文章主要向大家介绍Python 字典相关的笔试题(二),主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

上次写了一个 Python 字典的笔试题,对一个嵌套的字典进行操做,删除value 值为 None 的 key 。详细内容见以前的文章Python 字典相关的笔试题(一)。面试还遇到一个比较有意思的笔试题,也是关于 Python 字典操做的,还涉及到递归。python


题目是这样的,给定一个列表,列表里面有多个字典,每一个字典都有相同的 key,其中 id 是惟一的,pid 是表示当前字典父级的 id,pid 为 0 时表示是根字典。对当前列表进行整理,在父级字典中增长一个叫 child 的 key,value 值是列表类型的,用来存放子级字典内容。面试

 

初始字典数据以下:json

raw_list = [    {"id": 1, "pid": 0},    {"id": 2, "pid": 0},    {"id": 3, "pid": 1},    {"id": 4, "pid": 3},    {"id": 5, "pid": 1},    {"id": 6, "pid": 2},    {"id": 7, "pid": 4},]


指望整理后的结果以下:微信

[    {        "id": 1,        "pid": 0,        "child": [            {                "id": 3,                "pid": 1,                "child": [                    {                        "id": 4,                        "pid": 3,                        "child": [                            {                                "id": 7,                                "pid": 4,                                "child": []                            }                        ]                    }                ]            },            {                "id": 5,                "pid": 1,                "child": []            }        ]    },    {        "id": 2,        "pid": 0,        "child": [            {                "id": 6,                "pid": 2,                "child": []            }        ]    }]


解题思路大概以下:app

1.先对原始数据进行简单处理函数

建立列表  tree_list 和字典 data_list_dicttree_list 存放 pid 为 0 的字典,data_list_dict 存放pid和其子级字典信息对一个关系url


2.而后再编写一个递归函数spa

对 tree_list 进行遍历,为每一个字典添加 child 字段,获得每一个字典的 id 同时,判断这个 id 是否存在于data_list_dict 中,存在则将 data_list_dict 中对应的子级字典添加到 child 字段中,依次递归。.net


代码以下:
3d

def list_dict_tree(data_list):    tree_list = []    data_list_dict = defaultdict(list)    for item in data_list:        if item.get("pid") == 0:            item["child"] = []            tree_list.append(item)
deep_item = deepcopy(item) deep_item["child"] = [] data_list_dict[item.get("pid")].append(deep_item)
recursion(tree_list, data_list_dict)    return tree_list    def recursion(data_list, data_list_dict): """ 递归 :param data_list: :param data_list_dict: :return: """ for item in data_list: id = item.get("id") if id in data_list_dict: item["child"].extend(data_list_dict.get(id)) recursion(item.get("child"), data_list_dict)


上面是个人我的解法,若是有更好解法的欢迎留言,一块儿讨论一块儿进步!


本文分享自微信公众号 - pythonista的平常(gh_fc70d5d98d3f)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。