2017-03-23 4 views
0

Entschuldigung für den Beitrag, wenn es redundant erscheint. Ich habe durch eine Reihe anderer Pfosten geschaut und ich kann anscheinend nicht finden, nach was ich suche - vielleicht bc bin ich ein python newby, der versucht, grundlegenden Code zu schreiben ...Wörterbuch w verschachtelt dicts zur Auflistung in der angegebenen Reihenfolge

gegeben ein Wörterbuch von irgendwelchem Größe: Einige Schlüssel haben einen einzelnen Wert, andere haben ein verschachteltes Wörterbuch als Wert.

Ich möchte das Wörterbuch in eine Liste (einschließlich der verschachtelten Werte als Listenelemente) aber in einer bestimmten Reihenfolge konvertieren.

zum Beispiel:

d = {'E':{'e3': 'Zzz', 'e1':'Xxx', 'e2':'Yyy'}, 'D': {'d3': 'Vvv', 'd1':'Nnn', 'd2':'Kkk'}, 'U': 'Bbb'} 

und ich würde es so aussehen mag:

order_list = ['U', 'D', 'E'] # given this order... 

final_L = ['U', 'Bbb', 'D', 'd1', 'Nnn', 'd2', 'Kkk', 'd3', 'Vvv', 'E', 'e1', 'Xxx', 'e2', 'Yyy', 'e3', 'Zzz'] 

Ich kann den Hauptschlüssel fällt in Ordnung, aber die die verschachtelten Werte. Hier ist, was ich bisher ...

d = {'E':{'e3': 'Zzz', 'e1':'Xxx', 'e2':'Yyy'}, 'D': {'d3': 'Vvv', 'd1':'Nnn', 'd2':'Kkk'}, 'U': 'Bbb'} 

order_list = ['U', 'D', 'E'] 

temp_list = [] 



for x in order_list: 
    for key,value in d.items(): 
     if key == x: 
      temp_list.append([key,value]) 

final_L = [item for sublist in temp_list for item in sublist] 
print(final_L) 

Meine aktuelle Ausgabe ist:

['U', 'Bbb', 'D', {'d1': 'Nnn', 'd2': 'Kkk', 'd3': 'Vvv'}, 'E', {'e1': 'Xxx', 'e3': 'Zzz', 'e2': 'Yyy'}] 

Antwort

0

So gibt es ein paar einfache Transformation mit einer Liste Verständnis zu machen:

>>> [(k, sorted(d[k].items()) if isinstance(d[k], dict) else d[k]) for k in 'UDE'] 
[('U', 'Bbb'), 
('D', [('d1', 'Nnn'), ('d2', 'Kkk'), ('d3', 'Vvv')]), 
('E', [('e1', 'Xxx'), ('e2', 'Yyy'), ('e3', 'Zzz')])] 

Jetzt Sie müssen nur eine willkürliche Tiefenliste glätten, hier ist eine post Beschreibung, wie man das macht:

import collections 
def flatten(l): 
    for el in l: 
     if isinstance(el, collections.Iterable) and not isinstance(el, str): 
      yield from flatten(e) 
     else: 
      yield el 

>>> list(flatten((k, sorted(d[k].items()) if isinstance(d[k], dict) else d[k]) for k in 'UDE')) 
['U', 'Bbb', 'D', 'd1', 'Nnn', 'd2', 'Kkk', 'd3', 'Vvv', 'E', 'e1', 'Xxx', 'e2', 'Yyy', 'e3', 'Zzz'] 
+0

Das ist großartig. Vielen Dank! – virgiliocyte

Verwandte Themen