2017-01-24 3 views
-4

Ich habe mit Listen wie dieseNested Wörterbuch mit Listen zu viele Wörterbücher

{ 
    'a': 1, 
    'x':[ 
      {'b': 1, 
      'c': [ 
      {'z': 12}, 
      {'z': 22}, 
      ] 
      }, 
      {'b': 2, 
      'c': [ 
       {'z': 10}, 
       {'z': 33}, 
      ] 
      } 
     ] 
    } 

Und ich will wandeln es in die Liste der flachen Wörterbücher Wörterbuch verschachtelt i wie diese bilden.

[ 
{'a': 1, 'b': 1, 'z': 12}, 
{'a': 1, 'b': 1, 'z': 22}, 
{'a': 1, 'b': 2, 'z': 10}, 
{'a': 1, 'b': 2, 'z': 33}, 
] 

Irgendeine Idee, wie man das erreicht?

+0

Wohin gingen 'x' und' c'? –

+0

x und c werden im Ergebnis nicht benötigt – user7462430

Antwort

0

Eine mögliche Lösung ist:

#!/usr/bin/env python3 
d = { 
    'a': 1, 
    'x': [ 
     { 
      'b': 1, 
      'c': [ 
       {'z': 12} 
      ] 
     }, 
     { 
      'b': 2, 
      'c': [ 
       {'z': 10} 
      ] 
     } 
    ] 
} 

res = [{"a": 1, "b": x["b"], "z": x["c"][0]["z"]} for x in d["x"]] 
print(res) 

Dies setzt voraus, dass es nur ein a (mit einem festen Wert von 1) und x Elemente ist und dieses Element ist mit den comprehension manuell hinzugefügt.

Die anderen beiden Elemente (b und z) stammen aus x Array mit einem Listenverständnis.

Um mehr darüber zu erfahren, wie Comprehensions folgendes lesen Arbeit:

PS. Sie sollen zuerst zeigen, was Sie bisher versucht haben und Hilfe dabei bekommen. Werfen Sie einen Blick auf SO rules, bevor Sie Ihre nächste Frage stellen.

0

Nachfolgend erzeugt das gewünschte Ergebnis:

[{'a': 1, 'b': 1, 'z': 12}, {'a': 1, 'b': 2, 'z': 10}] 

Benutzung auf eigene Gefahr. Folgendes wurde nur an Ihrem Beispiel getestet.

from itertools import product 

def flatten(D): 

    if not isinstance(D, dict): return D 

    base = [(k, v) for k, v in D.items() if not isinstance(v, list)] 
    lists = [[flatten(x) for x in v] for k, v in D.items() if isinstance(v, list)] 

    l = [] 
    for p in product(*lists): 
     r = dict(base) 
     for a in p: 
      for d in a: 
       r.update(d) 
     l.append(r) 

    return l 

Die folgenden Tests oben.

d = { 
    'a': 1, 
    'x':[ 
      {'b': 1, 
      'c': [ 
      {'z': 12} 
      ] 
      }, 
      {'b': 2, 
      'c': [ 
       {'z': 10} 
      ] 
      } 
     ] 
    } 

print flatten(d) 
Verwandte Themen