python - 将具有父项的对象字典转换为具有子项的嵌套字典

标签 python dictionary nested hierarchy

我有一个具有父子关系的实体字典,是在解析文件中每个实体的父级后获得的。 我最终得到了一个具有以下结构的字典,其中每个元素都有其所有父元素的完整列表。示例字典:

data_dict = {
    '1388004': {'content': '13', 
                'parents': ['1280', '1279', '90964', '1385', '91061', '1239', '1783272', '2', '131567', '1'], 
                'name': 'foo'}, 
    '1895753': {'content': '11', 
                'parents': ['46913', '45401', '356', '28211', '1224', '2', '131567', '1'], 
                'name': 'bar'}, 
    '642227': {'content': '11', 
               'parents': ['82986', '1903409', '91347', '1236', '1224', '2', '131567', '1'], 
               'name': 'baz'}, 
    '89373': {'content': '27', 
               'parents': ['768507', '768503', '976', '68336', '1783270', '2', '131567', '1'], 
               'name': 'zab'}, 
    '81406': {'content': '21', 
               'parents': ['872', '194924', '213115', '28221', '68525', '1224', '2', '131567', '1'], 
               'name': 'oof'}, 
    '796027': {'content': '12', 
               'parents': ['410829', '410830', '4892', '4891', '147537', '716545', '4890', '451864', '4751', '33154', '2759', '131567', '1'], 
               'name': 'ofo'}, 
    '589342': {'content': '16', 
               'parents': ['3027', '2759', '131567', '1'], 
               'name': 'raz'}
    }

parents 列表以相反顺序表示给定实体的所有父级。这意味着对于 589342,层次结构如下:1(我的树的根)包含 131567,其中包含 2759 ,包含 3027,其本身包含 589342

我需要的输出是所有实体及其子级的列表或字典(不是像我目前拥有的父级),并且理想情况下看起来像这样(让我们忽略内容name 字段(目前):

{'id': '1', 'children':[{
    'id':'131567', 'children':[
            {'id':'2759', 'children':[...]}, 
            {'id':'2', 'children':[...]}
        ]
    }, 
    ...
    ]
}

欢迎任何关于如何实现这一目标的想法!如果您需要更多信息,请告诉我。

最佳答案

首先,将您的 data_dict 转换为“ anchor ”列表:

parents = [[k] + v["parents"] for k, v in data_dict.items()]

然后,您可以以相反的顺序迭代这些列表,并相应地将新条目添加到字典中:

root = {}
for hierarchy in parents:
    current = root
    for node in reversed(hierarchy):
        current = current.setdefault(node, {})

结果格式有点不同...

{'1': {'131567': {'2': {'1224': {'1236': {'91347': {'1903409': {'82986': {'642227': {}}}}},
                                 '28211': {'356': {'45401': {'46913': {'1895753': {}}}}},
                                 '68525': {'28221': {'213115': {'194924': {'872': {'81406': {}}}}}}},
                        '1783270': {'68336': {'976': {'768503': {'768507': {'89373': {}}}}}},
                        '1783272': {'1239': {'91061': {'1385': {'90964': {'1279': {'1280': {'1388004': {}}}}}}}}},
                  '2759': {'3027': {'589342': {}},
                           '33154': {'4751': {'451864': {'4890': {'716545': {'147537': {'4891': {'4892': {'410830': {'410829': {'796027': {}}}}}}}}}}}}}}}

...但之后应该很容易翻译,例如像这样:

def translate(d):
    return [{"id": k, "children": translate(v)} for k, v in d.items()]

关于python - 将具有父项的对象字典转换为具有子项的嵌套字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45099634/

相关文章:

python - 我怎样才能让这个简单的Python登录程序循环起来?

python - Redis py : when to use connection pool?

python - 合并 2 个字典但使值成为平均值的最 pythonic 方法是什么?

python - 如何创建空词典列表并填充后记?

c# - 使用 Entity Framework 6 在数据库中查找等效的嵌套对象

python - 如何在pyqt中删除QFrame

python - os.system() 在 Ubuntu 中与 "strings"命令一起使用时不起作用

python - 删除项目后重命名字典键的更好方法?

java - 嵌套类中的反射

python:嵌套类:访问外部类类成员