使用python构建树
我是python新手,正在尝试使用python构建具有父子关系的树。我正面临着艰难的时刻: 数据帧:使用python构建树,python,tree,Python,Tree,我是python新手,正在尝试使用python构建具有父子关系的树。我正面临着艰难的时刻: 数据帧: data = [['root','Parent1','Children1','Grand Childern 1','Great Grand Childern 1'],['root','Parent1','Children2','Grand Childern 1','Great Grand Childern 1'],['root','Parent1','Children2','Grand Chil
data = [['root','Parent1','Children1','Grand Childern 1','Great Grand Childern 1'],['root','Parent1','Children2','Grand Childern 1','Great Grand Childern 1'],['root','Parent1','Children2','Grand Childern 2','Great Grand Childern 1'],['root','Parent2','Children1','Grand Childern 1','Great Grand Childern 1'],['root','Parent2','Children2','Grand Childern 1','Great Grand Childern 1']]
df=pd.DataFrame(data,columns=['LEVEL 1','LEVEL 2','LEVEL 3','LEVEL 4','LEVEL 5'])
我正在尝试转换为JSON树格式,如下所示:
{
"name": "root",
"children": [{
"name": "Parent1",
"children": [{
"name": "Children1" ,
"children":[{
"name":"Grand Children1",
"children":[{
"name":"Great Grand Children1"
}]
}]},
{
"name": "Children2" ,
"children":[{
"name":"Grand Children1",
"children":[{"name":"Great Grand Children1"}],
"name":"Grand Children2",
"children":[{"name":"Great Grand Children1"}]}
] }
]
},
{
"name": "Parent2",
"children": [
{
"name": "Children1" ,
"children":[{"name":"Grand Children1",
"children":[{"name":"Great Grand Children1"}]}] },
{
"name": "Children2" ,
"children":[{
"name":"Grand Children1","children":[{"name":"Great Grand Children1"}],
"name":"Grand Children1","children":[{"name":"Great Grand Children2"}]}
] }
]
}]
}
数据帧:
如果有人能帮助我,我将不胜感激。作为中间步骤,您可能希望将列表列表(当前不在树的结构中,而是指定树的各个垂直分支)转换为DICT树,其中每个节点都包含对其所有子节点的引用 使用dict从列表列表中构建树,可以非常简单地确保任何给定节点的所有子节点都位于正确的位置(即在该节点下分组):
现在,您已经拥有了实际树结构中的所有内容,将其转换为所需的任何更具体的格式(例如,所需的JSON)应该很简单。如果它不必来自“熊猫”库,您可以使用“”库来创建树,和“”将其导出为JSON。您可以对集合使用递归。defaultdict:
from collections import defaultdict
def to_tree(d):
_d = defaultdict(list)
for a, *b in d:
_d[a].append(b)
return [{'name':a, 'children':to_tree(k)} if (k:=list(filter(None, b))) else \
{'name':a} for a, b in _d.items()]
data = [['root','Parent1','Children1','Grand Childern 1','Great Grand Childern 1'],['root','Parent1','Children2','Grand Childern 1','Great Grand Childern 1'],['root','Parent1','Children2','Grand Childern 2','Great Grand Childern 1'],['root','Parent2','Children1','Grand Childern 1','Great Grand Childern 1'],['root','Parent2','Children2','Grand Childern 1','Great Grand Childern 1']]
输出:
[
{
"name": "root",
"children": [
{
"name": "Parent1",
"children": [
{
"name": "Children1",
"children": [
{
"name": "Grand Childern 1",
"children": [
{
"name": "Great Grand Childern 1"
}
]
}
]
},
{
"name": "Children2",
"children": [
{
"name": "Grand Childern 1",
"children": [
{
"name": "Great Grand Childern 1"
}
]
},
{
"name": "Grand Childern 2",
"children": [
{
"name": "Great Grand Childern 1"
}
]
}
]
}
]
},
{
"name": "Parent2",
"children": [
{
"name": "Children1",
"children": [
{
"name": "Grand Childern 1",
"children": [
{
"name": "Great Grand Childern 1"
}
]
}
]
},
{
"name": "Children2",
"children": [
{
"name": "Grand Childern 1",
"children": [
{
"name": "Great Grand Childern 1"
}
]
}
]
}
]
}
]
}
]
不带Python3.8赋值表达式的解决方案:
from collections import defaultdict
def to_tree(d):
_d = defaultdict(list)
for a, *b in d:
_d[a].append(b)
vals = [[a, list(filter(None, b))] for a, b in _d.items()]
return [{'name':a, 'children':to_tree(b)} if b else {'name':a} for a, b in vals]
最好向您展示代码的位置,并准确解释哪些代码不适用。否则,看起来你希望我们为你做这项工作,而我们当然不会这样做!行:return[{'name':a,'children':to_tree(k)}如果(k:=list(filter(None,b)))else\{'name':a}对于a,b在{'d.items()]中不起作用,它在'k'@ImSanjay
k
处的抛出语法错误被用于赋值表达式中,该表达式仅在Python3.8中可用。请参阅我最近的编辑,因为我添加了一个与[
{
"name": "root",
"children": [
{
"name": "Parent1",
"children": [
{
"name": "Children1",
"children": [
{
"name": "Grand Childern 1",
"children": [
{
"name": "Great Grand Childern 1"
}
]
}
]
},
{
"name": "Children2",
"children": [
{
"name": "Grand Childern 1",
"children": [
{
"name": "Great Grand Childern 1"
}
]
},
{
"name": "Grand Childern 2",
"children": [
{
"name": "Great Grand Childern 1"
}
]
}
]
}
]
},
{
"name": "Parent2",
"children": [
{
"name": "Children1",
"children": [
{
"name": "Grand Childern 1",
"children": [
{
"name": "Great Grand Childern 1"
}
]
}
]
},
{
"name": "Children2",
"children": [
{
"name": "Grand Childern 1",
"children": [
{
"name": "Great Grand Childern 1"
}
]
}
]
}
]
}
]
}
]
from collections import defaultdict
def to_tree(d):
_d = defaultdict(list)
for a, *b in d:
_d[a].append(b)
vals = [[a, list(filter(None, b))] for a, b in _d.items()]
return [{'name':a, 'children':to_tree(b)} if b else {'name':a} for a, b in vals]