前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python 字典相关的笔试题(二)

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

作者头像
用户4945346
发布2021-08-18 10:52:14
3440
发布2021-08-18 10:52:14
举报
文章被收录于专栏:pythonista的日常pythonista的日常

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

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

初始字典数据如下:

代码语言:javascript
复制
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},
]

期望整理后的结果如下:

代码语言:javascript
复制
[
    {
        "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": []
            }
        ]
    }
]

解题思路大概如下:

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

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

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

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

代码如下:

代码语言:javascript
复制
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)

上面是我的个人解法,如果有更好解法的欢迎留言,一起讨论一起进步!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-08-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 pythonista的日常 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档