2016-03-14 20 views
8

Die Tabelle:aus der Liste der Wörterbuch in Python

categories = Table("categories", metadata, 
        Column("id", Integer, primary_key=True), 
        Column("name", String), 
        Column("parent_id", Integer, ForeignKey("categories.id"), 
          CheckConstraint('id!=parent_id'), nullable=True), 

) 

Eine Kategorie viele Kinder haben, aber nur 1 Elternteil. Ich habe die Liste der Wörterbuchwerte wie folgt mit CTE: z. Für id: 14 ist parent 13 und wird von parent 8 -> 10-> 12 -> 13 -> 14 durchlaufen, wobei parent 8 keine übergeordnete ID hat.

[ 
    { 
     "id": 14, 
     "name": "cat14", 
     "parent_id": 13, 
     "path_info": [ 
     8, 
     10, 
     12, 
     13, 
     14 
     ] 
    }, 
    { 
     "id": 15, 
     "name": "cat15", 
     "parent_id": 13, 
     "path_info": [ 
     8, 
     10, 
     12, 
     13, 
     15 
     ] 
    } 
    ] 

Ich möchte die Attribute der Eltern als Unterkategorien in der Liste auch als eingebettete erhalten:

{ 
    "id": 14, 
    "name": "cat14", 
    "parent_id": 13, 
    "subcats": [ 
     { 
     "id: 8", 
     "name": "cat8", 
     "parent_id":null 
     }, 
     { 
     "id: 10", 
     "name": "cat10", 
     "parent_id":8 
     }, 
     { 
     "id: 12", 
     "name": "cat12", 
     "parent_id":10 
     }, 
     and similarly for ids 13 and 14..... 
    ] 
}, 
{ 
    "id": 15, 
    "name": "cat15", 
    "parent_id": 13, 
    "subcats": [ 
     { 
     "id: 8", 
     "name": "cat8", 
     "parent_id":null 
     }, 
     { 
     "id: 10", 
     "name": "cat10", 
     "parent_id":8 
     }, 
     { 
     "id: 12", 
     "name": "cat12", 
     "parent_id":10 
     }, 
     and similarly for ids 13, 14, 15..... 
    ] 
} 

] Beachten Sie, dass ‚path_info‘ wurde aus dem Wörterbuch gelöscht und jede ID hat wurde mit seinen Details angezeigt. Ich möchte JSON-Dumps mit dem oben eingerückten Format. Wie geht es? Mit Kolben 0,10, Python 2.7

Antwort

1

Es gibt eine tolerierbare Möglichkeit, dies mit ein paar Listen/dict-Übersichten zu tun.

lst = [{"id": 14, "name": "cat14", "parent_id": 13, "path_info": [8, 10, 12, 13, 14]}, {"id": 15, "name": "cat15", "parent_id": 13, "path_info": [8, 10, 12, 13, 15]}] 

master_dct = { d['id'] : d for d in lst} 
for d in lst: 
    d['subcats'] = [{field : master_dct[i][field] for field in ['id', 'name', 'parent_id']} \ 
     for i in d['path_info'] if i in master_dct] 

import json 
with open('out.json', 'w') as f: 
    json.dump(lst, f) 
1

Sie können es in Python-Code ausführen:

Da wir ein JSON-Objekt haben. Ich habe es leicht modifiziert - hinzugefügt abwesenden Knoten und wickeln Sie in ein Objekt, wie es durch die Spezifikation erforderlich ist:

{ 
     "array": [ 
      { 
      "id": 14, 
      "name": "cat14", 
      "parent_id": 13, 
      "path_info": [ 
       8, 
       10, 
       12, 
       13, 
       14 
      ] 
      }, 
      { 
      "id": 15, 
      "name": "cat15", 
      "parent_id": 13, 
      "path_info": [ 
       8, 
       10, 
       12, 
       13, 
       15 
      ] 
      }, 
      { 
      "id": 13, 
      "name": "cat13", 
      "parent_id": 12, 
      "path_info": [ 
       8, 
       10, 
       12, 
       13 
      ] 
      }, 
     { 
      "id": 12, 
      "name": "cat12", 
      "parent_id": 10, 
      "path_info": [ 
       8, 
       10, 
       12 
      ] 
      }, 
      { 
      "id": 10, 
      "name": "cat10", 
      "parent_id": 8, 
      "path_info": [ 
       8, 
       10 
      ] 
      }, 
      { 
      "id": 8, 
      "name": "cat8", 
      "parent_id": null, 
      "path_info": [ 
       8 
      ] 
      } 
     ] 
    } 

Dann können Sie folgenden Code verwenden:

# load data above from file 
    j=json.load(open('json_file_above.json')) # 

    # the array with real data we need 
    a=j['array'] 

    # auxiliary dict which have node identificators as keys and nodes as values 
    d={x['id']:x for x in a} 

    # here the magic begins :) 
    for x in a: 
     # add new key with list to each element 
     x['subcats'] = [ 
         # compose dict element for subcats 
         dict(id=i, name=d[i]['name'], parent_id=d[i]['parent_id']) 
         for 
         i 
         in [ 
          # we take path_info id list and 
          # cut off the first element - itself 
          y for y in x['path_info'][1:] 
          ] 
         ] 
     del x['path_info'] 

Um sicher zu sein, Sie werden immer das, was Sie brauchen:

>>> print(json.dumps(a, indent=True)) 
    [ 
    { 
     "name": "cat14", 
     "subcats": [ 
     { 
     "name": "cat10", 
     "id": 10, 
     "parent_id": 8 
     }, 
     { 
     "name": "cat12", 
     "id": 12, 
     "parent_id": 10 
     }, 
     { 
     "name": "cat13", 
     "id": 13, 
     "parent_id": 12 
     }, 
     { 
     "name": "cat14", 
     "id": 14, 
     "parent_id": 13 
     } 
     ], 
     "id": 14, 
     "parent_id": 13 
    }, 
    { 
     "name": "cat15", 
     "subcats": [ 
     { 
     "name": "cat10", 
     "id": 10, 
     "parent_id": 8 
     }, 
     { 
     "name": "cat12", 
     "id": 12, 
     "parent_id": 10 
     }, 
     { 
     "name": "cat13", 
     "id": 13, 
     "parent_id": 12 
     }, 
     { 
     "name": "cat15", 
     "id": 15, 
     "parent_id": 13 
     } 
     ], 
     "id": 15, 
     "parent_id": 13 
    }, 
    { 
     "name": "cat13", 
     "subcats": [ 
     { 
     "name": "cat10", 
     "id": 10, 
     "parent_id": 8 
     }, 
     { 
     "name": "cat12", 
     "id": 12, 
     "parent_id": 10 
     }, 
     { 
     "name": "cat13", 
     "id": 13, 
     "parent_id": 12 
     } 
     ], 
     "id": 13, 
     "parent_id": 12 
    }, 
    { 
     "name": "cat12", 
     "subcats": [ 
     { 
     "name": "cat10", 
     "id": 10, 
     "parent_id": 8 
     }, 
     { 
     "name": "cat12", 
     "id": 12, 
     "parent_id": 10 
     } 
     ], 
     "id": 12, 
     "parent_id": 10 
    }, 
    { 
     "name": "cat10", 
     "subcats": [ 
     { 
     "name": "cat10", 
     "id": 10, 
     "parent_id": 8 
     } 
     ], 
     "id": 10, 
     "parent_id": 8 
    }, 
    { 
     "name": "cat8", 
     "subcats": [], 
     "id": 8, 
     "parent_id": null 
    } 
    ] 
    >>> 
1

der pythonic Code hierfür: Einfach und unkompliziert

import json 
categories = [] #input 
def transform(category, child_node_id): 
    category['subcats'].append({ 
     'id': child_node_id, 
     'name': 'cat%s' % child_node_id, 
     'parent_id': category['id'] 
    }) 


for category in categories: 
    category['subcats'] = [] 
    [transform(category, child_node_id) for child_node_id in category['path_info']] 
    category.pop('path_info', None) 

print(json.dumps(categories, indent=4)) 
Verwandte Themen