我正在编写一些代码,其中我以这种格式输入了一些数据:
_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] 删除。
我来说两句