上次写了一个 Python 字典的笔试题,对一个嵌套的字典进行操作,删除value 值为 None 的 key 。详细内容见之前的文章Python 字典相关的笔试题(一)。面试还遇到一个比较有意思的笔试题,也是关于 Python 字典操作的,还涉及到递归。
题目是这样的,给定一个列表,列表里面有多个字典,每个字典都有相同的 key,其中 id 是唯一的,pid 是表示当前字典父级的 id,pid 为 0 时表示是根字典。对当前列表进行整理,在父级字典中增加一个叫 child 的 key,value 值是列表类型的,用来存放子级字典内容。
初始字典数据如下:
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": []
}
]
}
]
解题思路大概如下:
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 字段中,依次递归。
代码如下:
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的日常 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!