从列表类别创建递归列表

莫汉

我正在编写一些代码,其中我以这种格式输入了一些数据:

_input = [
        ('Cat 1', 'Sub Cat 1', 'lvl_3_cat-1'),
        ('Cat 1', 'Sub Cat 2', 'lvl_3_cat-2'),
        ('Cat 2', 'Sub Cat 3', 'lvl_3_cat-3')
    ]

我需要将以下类别的目录转换为父子嵌套列表,可以对其进行迭代以获取嵌套关系列表。

预期产量

expected output = [{
    "name": 'Cat 1',
    "children": [{
        "name": 'Sub Cat 1',
        "children": [{
            "name": 'lvl_3_cat-1',
            "children": []
        }]
    },{
        "name": 'Sub Cat 2',
        "children": [{
            "name": 'lvl_3_cat-2',
            "children": []
        }]
    }]
},{
    "name": 'Cat 2',
    "children": [{
        "name": 'Sub Cat',
        "children": [{
            "name": 'lvl_3_cat-3',
            "children": []
        }]
    }]
}]

在此示例中,输入具有3级嵌套,但这可以是动态的,即最多n个。

我当前的代码

    def dsearch(lod, name):
        for e in lod:
            if e["name"] == name:
                return e
            else:
                return dsearch(e["children"], name)
        return {
            'name': name,
            'children': []
        }


    data = []
    lvl_products = [
        ('Cat 1', 'Sub Cat 1', 'lvl_3_cat-1'),
        ('Cat 1', 'Sub Cat 2', 'lvl_3_cat-2'),
        ('Cat 2', 'Sub Cat 3', 'lvl_3_cat-3')
    ]

    for lvl_product in lvl_products:
        print(lvl_product)
        parent = None; main_parent = None
        for _ in range(len(lvl_product)):
            element = dsearch(data, lvl_product[_])
            print(element)
            if parent:
                parent['children'].append(element)
            if main_parent is None:
                main_parent = parent
            parent = element
        data.append(main_parent)
    print(data) 

我目前的输出

[
    {
        "children": [
            {
                "children": [
                    {
                        "children": [],
                        "name": "lvl_3_cat-1"
                    },
                    {
                        "children": [],
                        "name": "lvl_3_cat-2"
                    }
                ],
                "name": "Sub Cat 1"
            },
            {
                "children": [
                    {
                        "children": [],
                        "name": "lvl_3_cat-1"
                    },
                    {
                        "children": [],
                        "name": "lvl_3_cat-2"
                    }
                ],
                "name": "Sub Cat 1"
            }
        ],
        "name": "Cat 1"
    },
    {
        "children": [
            {
                "children": [
                    {
                        "children": [],
                        "name": "lvl_3_cat-1"
                    },
                    {
                        "children": [],
                        "name": "lvl_3_cat-2"
                    }
                ],
                "name": "Sub Cat 1"
            },
            {
                "children": [
                    {
                        "children": [],
                        "name": "lvl_3_cat-1"
                    },
                    {
                        "children": [],
                        "name": "lvl_3_cat-2"
                    }
                ],
                "name": "Sub Cat 1"
            }
        ],
        "name": "Cat 1"
    }
]



客人

您可以使用基于的树状数据结构collections.defaultdict这将类别级别用作键,并将子树用作值:

from collections import defaultdict


def tree():
    return defaultdict(tree)


def insert(node, value):
    if value:
        key, *remainder = value
        insert(node[key], remainder)


data = [
    ('Cat 1', 'Sub Cat 1', 'lvl_3_cat-1'),
    ('Cat 1', 'Sub Cat 2', 'lvl_3_cat-2'),
    ('Cat 2', 'Sub Cat 3', 'lvl_3_cat-3'),
]
root = tree()
for sample in data:
    insert(root, sample)

import json
print(json.dumps(root, indent=2, default=dict))

这将导致以下数据结构:

{
  "Cat 1": {
    "Sub Cat 1": {
      "lvl_3_cat-1": {}
    },
    "Sub Cat 2": {
      "lvl_3_cat-2": {}
    }
  },
  "Cat 2": {
    "Sub Cat 3": {
      "lvl_3_cat-3": {}
    }
  }
}

如果您确实想使用"name""children"来保留单独的dict包装器,则可以使用以下函数转换上面的树:

def convert(node):
    return [{'name': key, 'children': convert(value)} for key, value in node.items()]

from pprint import pprint
pprint(convert(root))

输出为:

[{'children': [{'children': [{'children': [], 'name': 'lvl_3_cat-1'}],
                'name': 'Sub Cat 1'},
               {'children': [{'children': [], 'name': 'lvl_3_cat-2'}],
                'name': 'Sub Cat 2'}],
  'name': 'Cat 1'},
 {'children': [{'children': [{'children': [], 'name': 'lvl_3_cat-3'}],
                'name': 'Sub Cat 3'}],
  'name': 'Cat 2'}]

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从向量列表创建递归列表

来自分类Dev

使用容器创建类别列表

来自分类Dev

在方案中递归创建列表

来自分类Dev

在Prolog中递归创建列表

来自分类Dev

迭代/递归创建链接列表

来自分类Dev

在Prolog中递归创建列表

来自分类Dev

从MySQL中的类别部分创建列表

来自分类Dev

从父选择列表创建子类别选择列表

来自分类Dev

C#从列表递归创建TreeView

来自分类Dev

C#从列表递归创建TreeView

来自分类Dev

如何创建尾递归反向列表过程?

来自分类Dev

如何使用递归功能创建列表

来自分类Dev

递归列表

来自分类Dev

是否可以在递归函数上创建列表列表?

来自分类Dev

使用Haskell总和类型创建递归列表-递归锚点?

来自分类Dev

如何创建递归函数以创建值列表

来自分类Dev

按类别分组列表

来自分类Dev

类别ManyToManyField的下载列表

来自分类Dev

Magento类别属性列表

来自分类Dev

高级Wordpress类别列表

来自分类Dev

流星动态类别列表

来自分类Dev

递归建立列表列表

来自分类Dev

创建一个使用列表的递归函数,并使用它来创建列表

来自分类Dev

F#递归创建一个int列表

来自分类Dev

如何在python中递归创建排列列表?

来自分类Dev

从递归嵌套的字段列表创建部分字典

来自分类Dev

递归地创建一个带角度的html列表

来自分类Dev

Python-创建整数列表并使用递归将其相加

来自分类Dev

从递归列表创建树视图C#Asp.net