2016-04-22 5 views
1

Angenommen, ein Wörterbuch enthält bestimmte Schlüssel. Gibt es eine einfache Möglichkeit, diese spezifischen Schlüssel mit Standardwerten zu ergänzen, wenn sie fehlen?So aktualisieren Sie ein Python-Diktat mit Standardschlüssel: in einem anderen Dict angegebene Wertepaare

Zum Beispiel:

default_dict = {'name': '', 'height': 100, 'age': 20} 

d = {'name': 'James', 'age': 65} 
d.set_defaults(default_dict) 

würde aktualisieren Sie das Wörterbuch d zu

{'name': 'James', 'age': 65, 'height': 100} 

wo die ursprünglichen Werte von d gehalten werden und nur die fehlenden Tasten hinzugefügt werden.

Die default_dict sollte dabei nicht zerstört werden.

+0

tun Sie einfach das Update umgekehrt – njzk2

+1

@ njzk2 Die Frage besagt, dass 'default_dict' sollte nicht zerstört werden. – Miguel

+0

eine Kopie davon machen – njzk2

Antwort

3

ein vorhandenes Wörterbuch zu aktualisieren, könnte ich den setdefault Methode des Wörterbuch verwenden:

for key, value in dict_of_defaults.items(): 
    dict_maybe_without_defaults.setdefault(key, value) 

Wenn ich ein neues Wörterbuch zu schaffen war, wo ich eine hatte kleine Anzahl von Schlüsseln, würde ich wahrscheinlich etwas mehr in Richtung der von Martijn geposteten Lösung machen.

4

Erstellen Sie eine Kopie der Standardeinstellungen, und aktualisieren Sie sie mit d; wenn alle Schlüssel in d Strings sind, können Sie dies mit einem dict() Aufruf:

d = dict(default_dict, **d) 

für Wörterbücher mit Nicht-String-Schlüssel, dann würden Sie zwei Schritten:

d = default_dict.copy() 
d.update({'name': 'James', 'age': 65}) 

oder könnten Sie verwenden eine Schleife, um d mit irgendwelchen Schlüsseln zu aktualisieren, die nicht unter Verwendung der Wörterbuchansichten vorhanden sind; dies ist jedoch nicht so schnell:

d = {'name': 'James', 'age': 65} 
d.update((k, default_dict[v]) for k in default_dict.viewkeys() - d) 

ersetzen viewkeys mit keys in Python 3.

Wenn Sie Python verwenden 3.5 oder neuer können Sie ähnliche Syntax verwenden, um ein neues Wörterbuch zu erstellen:

d = {**default_dict, 'name': 'James', 'age': 65} 

Die Schlüssel-Wert-Paare von default_dict werden zuerst angewendet, gefolgt von den von Ihnen neu festgelegten Schlüsseln; Diese überschreiben die alten. Siehe PEP 448 - Additional Unpacking Generalizations in der Dokumentation 3.5 What's New.

Jede der Methoden zum Erstellen eines neuen Wörterbuchs kann ein vorhandenes Wörterbuch einfach aktualisieren, indem es in einen dict.update()-Aufruf eingefügt wird. So ist die erste mit d in-Place-Aktualisierung könnte:

d.update(dict(default_dict, **d)) 
+2

In 3.5, kann dies auch als '{** default_dict, ** d}', ohne Beschränkung auf String-Schlüssel erfolgen. – user2357112

+0

@ user2357112: yup, schaute wieder die Dokumente auf; Dies wird am einfachsten direkt auf das Literal für "d" angewendet. –

+0

Ich bin mir ziemlich sicher, dass es irgendwo im Internet einen Kommentar gibt, wo Guido das 'dict (Mapping, ** othermapping)' 'verabscheuungswürdig 'nennt - obwohl er vielleicht seine Haltung danach gelockert hat? http://StackOverflow.com/a/26853961/748858 – mgilson

1

Sie können prüfen, ein collections.ChainMap mit einem Rückfall zu assoziieren:

import collections 

default_dict = {'name': '', 'height': 100, 'age': 20} 

d = collections.ChainMap({'name': 'James', 'age': 65},default_dict) 

>>> d 
ChainMap({'name': 'James', 'age': 65}, {'name': '', 'height': 100, 'age': 20}) 
>>> dict(d) #this flattens the map but isn't necessary for it to work 
{'name': 'James', 'height': 100, 'age': 65} 

Beachten Sie auch, dass da alle mutierenden Methoden nur das erste Mapping ändern default_dict von pop oder anderen Verfahren sicher ist.

Verwandte Themen