首页 > 解决方案 > Python使用“父”键从平面字典中创建嵌套结构

问题描述

让我们考虑一下 Python 3 中的这个例子:

class SimpleObj:
    def __init__(self, own_id: int, parent_id: int):
        self.parent_id = parent_id
        self.own_id = own_id
        self.children_objects = []  # type: List[SimpleObj]

test_dict = {}
test_dict[0] = SimpleObj(own_id=0, parent_id=-1)  # -1 will mean root node
test_dict[1] = SimpleObj(own_id=1, parent_id=0)
test_dict[123] = SimpleObj(own_id=123, parent_id=1)
test_dict[5] = SimpleObj(own_id=5, parent_id=123)

创建递归嵌套结构的最 Pythonic 方法是什么,例如 SimpleObj withown_id=1将其children_objects列表填充一个元素,该元素将是 SimpleObj with own_id=123?它闻起来很像二叉树问题,但我真的没有找到一个可行的解决方案来将这种字典变成树状对象的结构。

标签: pythonooprecursion

解决方案


也许您可以创建一个小函数来处理新 SimpleObj 的创建:

class SimpleObj:
    def __init__(self, own_id: int, parent_id: int):
        self.parent_id = parent_id
        self.own_id = own_id
        self.children_objects = []


def addSimpleObj(struct, own_id, parent_id):
    struct[own_id] = SimpleObj(own_id=own_id, parent_id=parent_id)
    if parent_id != -1:
        try:
            struct[parent_id].children_objects.append(struct[own_id])
        except IndexError:
            print('the parent_id does not exists')

test_dict = {}
addSimpleObj(test_dict, 0, -1)
addSimpleObj(test_dict, 1, 0)
addSimpleObj(test_dict, 123, 1)
addSimpleObj(test_dict, 5, 123)

这只是一个开始,但它似乎起到了作用。例如,您可以对其进行修改以处理尝试为已存在的键重新创建 SimpleObj 的情况。


推荐阅读