微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决将节点列表转换为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]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?