2016-08-31 7 views
0

Ich beginne mit einem dict, die von einem apiWie kann ich mit verschachtelten dicts in Python

start_dict = { 
    "a": 795, 
    "b": 1337, 
    "c": [ 
     { 
      "d1": 2, 
      "d2": [ 
       { 
         "e1": 4 
       } 
     ] 
     } 
    ] 
    } 

Ich muß erstellen Sie eine separate dict von diesem dict eine neue dict von dicts von einem dict erstellen. Das hat jeden Schlüssel und Wert getrennt durch ihren Schlüssel und Wert in ihr eigenes dict. Während die verschachtelten Diktate intakt bleiben.

values = 
{ 
"fields": [ 
    { 
    "element_name": "a", 
    "value": 795 
    }, 
    { 
    "element_name": "b", 
    "value": 1337 
    }, 
    { 
    "element_name": "c", 
    "value": [ 
      { 
       "element_name": "d1", 
       "value": 2 
      }, 
      { 
       "element_name": "d2", 
       "value" : [ 
          { 
           "element_name": "e1", 
           "value": 4 
          } 
         ] 
      ] 
     } 
    ] 
    } 

Die tatsächliche dict ist ein bisschen größer, aber es gibt nicht mehr als eine zwei tief verschachtelte dicts in den ursprünglichen, aber viele einzelnen verschachtelten dicts. Dies ist der einzige Weg, wie die API neue Daten akzeptiert, so dass ich irgendwie feststecke, bis ich es herausgefunden habe. Jede Hilfe wird sehr geschätzt, da ich Python ziemlich neu kenne (3 Wochen) lol, wenn das etwas Einfaches ist, sei bitte nicht zu hart.

+0

Haben Sie versucht, etwas selbst zu schreiben? Setzen Sie einen Code in die Frage ... – Dekel

+0

Ihr 'c' Wert ist ein bisschen ein Rätsel. Sie haben eine Liste mit einem einzelnen Wörterbuch in dieser Liste, aber die resultierende Ausgabe ist eine Liste mit den Schlüssel-Wert-Paaren aus diesem einen Wörterbuch, das in separate Wörterbücher umgewandelt wurde. Was passiert, wenn mehr als ein Element in dieser 'c' Liste enthalten ist? Was, wenn mehr Listen enthalten sind oder Objekte, die keine Wörterbücher sind? Gleiches gilt für "d2". –

+0

Meine folgende Lösung führt zu einer * verschachtelten * Liste, da das einzelne Wörterbuch in eine Liste von Schlüssel-Wert-Wörterbüchern umgewandelt wird. Wenn es mehr als ein Wörterbuch gibt, bedeutet das, dass jedes von diesen eine separate Liste innerhalb der Master-'c'-Liste wird. Alle anderen Objekttypen werden auf diese Weise ebenfalls korrekt behandelt. –

Antwort

5

Sie können die Ausgabe mit einer rekursiven Funktion bauen:

def transform(ob): 
    if isinstance(ob, list): 
     return [transform(v) for v in ob] 
    elif not isinstance(ob, dict): 
     return ob 
    return [{'element_name': k, 'value': transform(v)} 
      for k, v in ob.items()] 

values = {'fields': transform(start_dict)} 

so jedes key, value Paar zu einem {'element_name': key, 'value': value} Wörterbuch in einer Liste umgewandelt wird, wobei jeder Wert, der eine Liste oder Wörterbuch selbst durch eine rekursive transformierte Anruf.

Demo:

>>> from pprint import pprint 
>>> def transform(ob): 
...  if isinstance(ob, list): 
...   return [transform(v) for v in ob] 
...  elif not isinstance(ob, dict): 
...   return ob 
...  return [{'element_name': k, 'value': transform(v)} 
...    for k, v in ob.items()] 
... 
>>> start_dict = { 
...  "a": 795, 
...  "b": 1337, 
...  "c": [ 
...   { 
...    "d1": 2, 
...    "d2": [ 
...     { 
...      "e1": 4 
...     } 
...   ] 
...   } 
...  ] 
...  } 
>>> pprint({'fields': transform(start_dict)}) 
{'fields': [{'element_name': 'a', 'value': 795}, 
      {'element_name': 'c', 
      'value': [[{'element_name': 'd1', 'value': 2}, 
         {'element_name': 'd2', 
         'value': [[{'element_name': 'e1', 'value': 4}]]}]]}, 
      {'element_name': 'b', 'value': 1337}]} 
+0

Wenn Sie also mit geschachtelten Dicts arbeiten, benötigen Sie eine rekursive Funktion, so dass sie, wenn sie auf ein verschachteltes Dict trifft, wieder in die Funktion zurückkehren kann. an dem Diktat neben dem Diktat arbeiten? Vielen Dank für Ihre Hilfe, es ist sehr geschätzt !!!! – Astrea

+0

Beachten Sie, dass Sie Rekursion * nicht * verwenden müssen; Ich finde es einfach, eine rekursive Funktion dafür zu schreiben. Sie könnten auch einen Stapel und eine Schleife verwenden. –

Verwandte Themen