将节点列表转换为python中的嵌套字典 节点列表

问题描述

我在 python 中有一个表示邻接列表的 dict 列表,我想将此列表转换为嵌套的 python dict。使用 namechildren 键。

节点列表

这是一个字典列表的例子,它们是列表的前 10 个元素。原始包含 1000 个元素。

[{'id': 1,'name': 'External sector','parent_id': 0},{'id': 3,'name': 'Capital and financial markets',{'id': 77,'name': 'Credit indicators',{'id': 15,'name': 'Economic activity',{'id': 17,'name': 'Monetary indicators',{'id': 30,'name': 'Regional economy',{'id': 114,'name': 'International economy',{'id': 157,'name': 'National private financial system',{'id': 176,'name': 'Financial Stability',{'id': 222,'name': 'Financial Inclusion','parent_id': 0}]

我尝试了什么

我在 SO 中找到了这个函数,它能够将这个 dict 列表转换为嵌套的 python dict:

def list_to_tree(data):
    out = { 
#         0: { 'id': 0,'parent_id': 0,'name': "Root node",'sub': [] }
    }

    for p in data:
        out.setdefault(p['parent_id'],{ 'sub': [] })
        out.setdefault(p['id'],{ 'sub': [] })
        out[p['id']].update(p)
        out[p['parent_id']]['sub'].append(out[p['id']])

    return out[0]

函数以这种方式生成字典:

{'id': 0,'name': 'rootnode','parent_id': None,'sub': [{'id': 1,'sub': [{'id': 2,'name': 'Exchange rates','parent_id': 1,'sub': [{'id': 242,'name': 'Controlled or free rates','parent_id': 2,'sub': []},{'id': 243,'name': 'Floating rates',{'id': 532,'name': 'Real and effective exchange rate indices',{'id': 533,'name': 'Foreign exchange and wage indicators',{'id': 548,'name': 'Average of period',

但我想以这种方式生成字典,没有 id

{
 'name': 'rootnode','children': [{
          'name': 'External sector','children': [{
                   'name': 'Exchange rates','children': [{
                            'name': 'Controlled or free rates','children': []},{
                            'name': 'Floating rates',{
                            'name': 'Real and effective exchange rate indices',{
                            'name': 'Foreign exchange and wage indicators',{
                            'name': 'Average of period',

有什么方法可以改变我找到的这个函数以产生所需的输出? 我们非常欢迎任何提示提示或建议。

解决方法

您可以稍作修改即可使用该功能:

  • 使用“children”键而不是“sub”键
  • 仅使用您想要的键(名称和子节点)初始化根节点
  • 不要调用 .update(复制所有键),只分配“名称”键
def list_to_tree(data):
    out = { 
        0: { 'name': 'rootnode','children': [] }
    }

    for p in data:
        out.setdefault(p['parent_id'],{ 'children': [] })
        out.setdefault(p['id'],{ 'children': [] })
        out[p['id']]['name'] = p['name']
        out[p['parent_id']]['children'].append(out[p['id']])

    return out[0]

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...