使用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

我是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 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]