2017-10-24 2 views
2

Ich habe eine Liste von Wörterbuch wie dieseConvert Wörterbuch in einem Wörterbuch verschachtelt

[ 
{'id':1, 'name': 'name1', 'education':{'university':'university1', 'subject': 'abc1'}}, 
{'id':2, 'name': 'name2', 'education':{'university':'university2', 'subject': 'abc2'}}, 
{'id':3, 'name': 'name3', 'education':{'university':'university3', 'subject': 'abc3'}}, 
] 

und ich möchte es konvertieren wie

[ 
{'id':1, 'name': 'name1', 'university':'university1', 'subject': 'abc1'}, 
{'id':2, 'name': 'name2', 'university':'university2', 'subject': 'abc2'}, 
{'id':3, 'name': 'name3', 'university':'university3', 'subject': 'abc3'}, 
] 

gibt es eine pythonic Weg, dies zu lösen.

+0

Sind das die tatsächlichen Daten oder haben Sie mehr Subdiktionen in Ihren Subdiktiven? –

+0

https://docs.python.org/2/library/functions.html#map – c69

Antwort

5

Sie könnten einfach wie folgt vor:

l = [...] 

for d in l: 
    d.update(d.pop('education', {})) 

# l 
[{'id': 1, 'name': 'name1', 'subject': 'abc1', 'university': 'university1'}, 
{'id': 2, 'name': 'name2', 'subject': 'abc2', 'university': 'university2'}, 
{'id': 3, 'name': 'name3', 'subject': 'abc3', 'university': 'university3'}] 
+0

es funktioniert gut :). Was ist mit dem verschachtelten Wörterbuch? +1 –

+0

Das ist eine andere Frage :) eine, die oft an diesen Ufern gefragt wurde. Sie werden viele Antworten finden, die "flachgedrückte verschachtelte Diktate" googeln. – schwobaseggl

0

Je nachdem, ob Sie die ursprüngliche Liste umwandeln möchten oder wenn Sie ein neues zurückkehren möchten Sie für eine dieser beiden Ansätze gehen könnte:

l = [ 
{'id':1, 'name': 'name1', 'education':{'university':'university1', 'subject': 'abc1'}}, 
{'id':2, 'name': 'name2', 'education':{'university':'university2', 'subject': 'abc2'}}, 
{'id':3, 'name': 'name3', 'education':{'university':'university3', 'subject': 'abc3'}}, 
] 

def flattenReturn(input): 
    output = {key: value for key, value in input.items() if type(value) != dict} 
    for value in input.values(): 
     if type(value) == dict: 
      output.update(value) 
    return output 

def flattenTransform(d): 
    for key, value in list(d.items()): 
     if isinstance(value, dict): 
      d.update(d.pop(key)) 

print(list(map(flattenReturn, l))) 
print(l) 
print("-"*80) 
map(flattenTransform, l) 
print(l) 

Wie Sie sehen können, generiert flattenReturn ein neues dict, das die Werte, die Wörterbücher sind, filtert und sie dann mit ihren Schlüsselwerten aktualisiert, um sie zu reduzieren, während die zweite Option das Diktat an Ort und Stelle ändert. Wenn die Größe der Daten groß ist, sollte eine Lösung mit Generatoren bevorzugt werden.

Verwandte Themen