2017-11-07 6 views
2

Ich habe Daten in folgendem Format:Convert getrennte Zeichenfolge und Wert in hierarchische JSON mit Python

[['Director', 9010], 
['Director - Product Manager', 9894], 
['Director - Product Manager - Project Manager', 9080], 
['Director - Product Manager - Project Manager - Staff', 5090], 
['Director - Product Manager - Project Manager - Staff 2', 5087], 
['Director - Product Manager - Project Manager 2', 9099],...] 

und einen Ausgang wollen, die wie folgt aussehen werden:

{ 
    'title': 'Director', 
    'id': 9010, 
    'children': [ 
     { 
      'title': 'Product Manager', 
      'id': 9894, 
      'children': [ 
       { 
        'title': 'Project Manager', 
        'id': 9080, 
        'children': [ 
         ... 
        ] 
       },{ 
        'title': 'Project Manager 2', 
        'id': 9099, 
        'children': [ 
         ... 
        ] 
       }], 
       ... 
      ] 
     }, 
     ... 
    ] 
} 

Ich habe Ich habe mit Wörterbüchern herumgespielt, aber ich habe Mühe, die IDs mit den Titeln abzugleichen. Irgendwelche Vorschläge werden geschätzt.

+0

uns zeigen, was Du hast es versucht. – FcoRodr

Antwort

2

Eine effiziente Möglichkeit besteht darin, die äußerste Ebene zu einer Liste anstatt zu einem Diktat zu machen. Wenn wir über jeden Titel in der Titelfolge iterieren, suchen wir nach einem Diktat mit diesem Titel in der aktuellen Liste. Wenn der Titel in der aktuellen Liste nicht existiert, müssen wir ein neues Diktat erstellen. Wenn es existiert, dann machen wir die Kinderliste dieses Diktats die neue aktuelle Liste und fahren damit fort, nach dem nächsten Titel zu suchen.

Ich habe auch eine rekursive prune Funktion geschrieben, die alle leeren Kinderlisten entfernt, sobald wir alle Daten eingegeben haben, falls Sie das tun wollen.

import json 

lst = [ 
    ['Director', 9010], 
    ['Director - Product Manager', 9894], 
    ['Director - Product Manager - Project Manager', 9080], 
    ['Director - Product Manager - Project Manager - Staff', 5090], 
    ['Director - Product Manager - Project Manager - Staff 2', 5087], 
    ['Director - Product Manager - Project Manager 2', 9099], 
] 

# Search for a matching name in the current list. 
# If it doesn't exist, create it. 
def insert(lst, name, idnum): 
    for d in lst: 
     if d['title'] == name: 
      break 
    else: 
     d = {'title': name, 'id': idnum, 'children': []} 
     lst.append(d) 
    return d['children'] 

# Remove empty child lists 
def prune(lst): 
    for d in lst: 
     if d['children']: 
      prune(d['children']) 
     else: 
      del d['children'] 

# Insert the data into the master list 
master = [] 
for names, idnum in lst: 
    lst = master 
    for name in [s.strip() for s in names.split(' - ')]: 
     lst = insert(lst, name, idnum) 

prune(master) 

# Get the top level dict from the master list 
data = master[0] 
print(json.dumps(data, indent=4)) 

Ausgang

{ 
    "title": "Director", 
    "id": 9010, 
    "children": [ 
     { 
      "title": "Product Manager", 
      "id": 9894, 
      "children": [ 
       { 
        "title": "Project Manager", 
        "id": 9080, 
        "children": [ 
         { 
          "title": "Staff", 
          "id": 5090 
         }, 
         { 
          "title": "Staff 2", 
          "id": 5087 
         } 
        ] 
       }, 
       { 
        "title": "Project Manager 2", 
        "id": 9099 
       } 
      ] 
     } 
    ] 
} 
0

Mit d als Eingang durchlaufen Ihre Eingabeliste mit.

Da es zwei Elemente in jeder Teil-Listen, halten Sie die Position und ID in der Iterationsvariable als p und id

Beispiel, Sie verarbeiten Liste ['Director - Product Manager - Project Manager - Staff', 5090],

Um den Titel jeder Position erhalten Sie Sie können die durch - getrennte Position teilen und die führenden und nachfolgenden Leerzeichen entfernen. Z. B.

>>> d[3][0] 
'Director - Product Manager - Project Manager - Staff' 
>>> map(str.strip,d[3][0].split('-')) 
['Director', 'Product Manager', 'Project Manager', 'Staff'] 

Der Ausgang dict, zusammen mit dem unmittelbar vorhergehenden Position Staff an die rekursive Suche Methode übergeben und es holt die alle Spiele des Befundes Wert, das heißt Project Manager und eine Liste zurückgibt. Hol das letzte Match.

>>> recursive_search([data,],'Product Manager')[-1] 
{'children': [{'children': [{'id': 5090, 'title': 'Staff'}, {'id': 5087, 'title': 'Staff 2'}], 'id': 9080, 'title': 'Project Manager'}, {'id': 9099, 'title': 'Project Manager 2'}], 'id': 9894, 'title': 'Product Manager'} 

Sie müssen die neue ID an die children Schlüssel des obigen Ergebnis anhängen!

Kombination aller oben,

d=[['Director', 9010],['Director - Product Manager', 9894],['Director - Product Manager - Project Manager', 9080],['Director - Product Manager - Project Manager - Staff', 5090],['Director - Product Manager - Project Manager - Staff 2', 5087],['Director - Product Manager - Project Manager 2', 9099],] 

from pprint import pprint  
def recursive_search(items, key): 
     found = [] 
     for item in items: 
       if isinstance(item, list): 
         found += recursive_search(item, key) 
       elif isinstance(item, dict): 
         if key in item.values(): 
           found.append(item) 
         found += recursive_search(item.values(), key) 
     return found 
data={} 
for p,id in d: 
     desig = map(str.strip,p.split('-')) 
     if len(desig)>1: 
       res = recursive_search([data,],desig[-2])[-1] 
       if res: 
         res['children']=res.get('children',[]) 
         res['children'].append({'id':id,'title':desig[-1]}) 
     else: 
       data = {'id':id,'title':p} 

pprint.pprint(data) 

Ausgang:

{'children': [{'children': [{'children': [{'id': 5090, 'title': 'Staff'}, 
              {'id': 5087, 
              'title': 'Staff 2'}], 
          'id': 9080, 
          'title': 'Project Manager'}, 
          {'id': 9099, 'title': 'Project Manager 2'}], 
       'id': 9894, 
       'title': 'Product Manager'}], 
'id': 9010, 
'title': 'Director'} 

Ref: Die recursive_search Funktion hier ist die leicht modifizierte Version des Suchens durch eine dict here erwähnt verwendet

Verwandte Themen