python - 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
?它闻起来很像二叉树问题,但我真的没有找到一个可行的解决方案来将这种字典变成树状对象的结构。
解决方案
也许您可以创建一个小函数来处理新 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 的情况。
推荐阅读
- django - Django 自动完成表单媒体标签问题
- sql - 这种类型的连接称为什么连接,连接在最后是合格的?
- git - Git - 查找提交消息包含特定字符串的文件
- angular - Highstock 图表 - 我希望图表从 x 轴上的 0%(开始)位置开始
- emacs - 限制 .dir-locals.el 搜索遍历子目录
- amazon-web-services - AWS CLI - aws ec2 describe-instances 为每个 EC2 实例检索密钥对
- javascript - 在 Phaser 3 中控制动画循环
- java - 多租户配置:事务上的 StaleObjectStateException (hibernate + spring-data-jpa)
- sql - 通过 Excel VBA 进行 SQL 查询的复杂 JOIN 子句中的语法错误
- odoo - 通过控制器在记录中创建日志注释