2016-11-18 11 views
1

Ich möchte wissen, was die beste/am meisten pythonische Art ist, zwei Wörterbücher von Wörterbüchern zu kombinieren.Wörterbücher von Wörterbüchern zusammenfügen

Ich habe zwei Wörterbücher, die so aussehen:

original = {'user1': {'COL': 'green', 'ID': '234235', 'NAME': 'andy'}, 
      'user2': {'COL': 'blue', 'ID': '234234', 'NAME': 'john'}} 

update = {'user1': {'COL': 'black', 'ID': '234235', 'NAME': 'andy'}, 
      'user2': {'COL': 'purple', 'SPEC': 'na'}} 

Ich möchte sie so zusammenfassen, so dass im update Wörterbuch gefundenen Werte die entsprechenden Werte im original Wörterbuch aktualisieren würde.

result = {'user1': {'COL': 'black', 'ID': '234235', 'NAME': 'andy'}, 
      'user2': {'COL': 'purple', 'ID': '234234', 'NAME': 'john', 'SPEC': 'na'}} 

habe ich versucht collections und copy Verwendung ich jedoch am Ende für den Schlüssel den gesamten Wert ersetzt wird.

+0

Kann 'update' einen' user' enthalten, der nicht in 'original' ist? – ekhumoro

+0

@ekhumoro, nein, Update enthält keinen 'Benutzer', der nicht in 'Original' ist –

+0

In diesem Fall ist die [Antwort von @wim] (http://stackoverflow.com/a/40684691/984421) was du brauchst. – ekhumoro

Antwort

1

Das ist nur eine einfache for-Schleife:

for k in original: 
    original[k].update(update.get(k, {})) 
0
for k in update: 
    if k in original: 
      original[k].update(update[k]) 
    else: 
      original[k] = update[k] 

Dies ist nur eine Verschachtelungsebene vorausgesetzt. Eine tiefere Lösung verspricht komplexer zu sein. Dies mutiert auch das Wörterbuch original, das nicht das gewünschte Verhalten sein kann.

0

Sie doppelte Iteration verwenden könnte, wenn es zwei Ebenen sind jedes Mal: ​​

for user, values in update.iteritems(): 
    for k, v in values.iteritems(): 
     original[user][k] = v 
0

Sie erstellen können eine verschachtelte dict Verständnis Ausdruck um es zu erreichen:

{k1: {k2: update[k1].get(k2, v2) for k2, v2 in v1.items()} for k1, v1 in original.items()} 

was wird retu Rn-Wert:

{'user2': {'ID': '234234', 'NAME': 'john', 'COL': 'purple'}, 'user1': {'ID': '234235', 'NAME': 'andy', 'COL': 'black'}} 
Verwandte Themen