Bangun pohon menggunakan python

Saya baru mengenal python dan mencoba membangun pohon dengan hubungan induk-anak menggunakan python. Saya menghadapi kesulitan untuk membuatnya:

Bingkai data:

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'])

Dan saya mencoba mengonversinya sebagai format pohon JSON seperti di bawah ini:

{
"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"}]}
          ] }
    ]
  }]
}

Bingkai Data:

masukkan deskripsi gambar di sini

Saya menghargai jika ada yang bisa membantu saya.


person Sanjay Chintha    schedule 07.05.2020    source sumber
comment
Sebaiknya tunjukkan di mana posisi kode Anda, dan jelaskan dengan tepat apa yang tidak berfungsi dengannya. Jika tidak, sepertinya Anda ingin kami melakukan pekerjaan untuk Anda, yang tentu saja tidak akan kami lakukan!   -  person Thierry Lathuille    schedule 07.05.2020


Jawaban (3)


Anda dapat menggunakan rekursi dengan collections.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']]

import json
print(json.dumps(to_tree(data), indent=4))

Keluaran:

[
  {
    "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"
                                }
                            ]
                        }
                    ]
                 }
             ]
          }
      ]
   }
]

Solusi tanpa ekspresi penugasan 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]
person Ajax1234    schedule 07.05.2020
comment
baris : return [{'name':a, 'children':to_tree(k)} if (k:=list(filter(None, b))) else \ {'name':a} for a, b in _d .items()] tidak berfungsi, ini membuat saya kesalahan sintaksis di 'k' - person Sanjay Chintha; 08.05.2020
comment
@ImSanjay k digunakan dalam ekspresi penugasan, yang hanya tersedia di Python3.8. Silakan lihat hasil edit terbaru saya, karena saya menambahkan solusi yang akan kompatibel dengan versi ‹ Python3.8. - person Ajax1234; 08.05.2020
comment
masih menimbulkan kesalahan AttributeError: objek 'daftar' tidak memiliki atribut 'item' - person Sanjay Chintha; 08.05.2020
comment
bisakah kita menambahkan nama kolom setelah atribut 'nama'? @Ajax1234 - person Sanjay Chintha; 10.06.2020

Jika tidak harus dari perpustakaan "Pandas" Anda dapat menggunakan perpustakaan 'anytree' untuk membuat pohon Anda, dan 'Pengekspor JSON' untuk mengekspornya ke JSON.

person shu    schedule 07.05.2020

Sebagai langkah perantara, Anda mungkin ingin mengubah daftar daftar Anda (yang saat ini tidak ada dalam struktur pohon, melainkan menentukan cabang vertikal individual dari pohon tersebut) menjadi pohon dicts yang setiap nodenya berisi referensi ke semua nodenya. node anak.

Menggunakan dict untuk membangun pohon dari daftar Anda membuatnya lebih mudah untuk memastikan bahwa semua anak dari setiap node berada di tempat yang tepat (yaitu dikelompokkan bersama di bawah node itu):

>>> 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']
]
>>> tree = {}
>>> for row in data:
...     node = tree
...     for cell in row:
...         node = node.setdefault(cell, {})
...
>>> tree
{'root': {
    'Parent1': {
        'Children1': {
            'Grand Childern 1': {
                'Great Grand Childern 1': {}
            }
        }, 
        'Children2': {
            'Grand Childern 1': {
                'Great Grand Childern 1': {}
            }, 
            'Grand Childern 2': {
                'Great Grand Childern 1': {}
            }
        }
    }, 
    'Parent2': {
        'Children1': {
            'Grand Childern 1': {
                'Great Grand Childern 1': {}
            }
        }, 
        'Children2': {
            'Grand Childern 1': {
                'Great Grand Childern 1': {}
            }
        }
    }
}}

Sekarang setelah Anda memiliki semuanya dalam struktur yang merupakan pohon sebenarnya, seharusnya mudah untuk mengubahnya menjadi format spesifik apa pun yang Anda perlukan (misalnya JSON yang diinginkan).

person Samwise    schedule 07.05.2020