2012-06-01 8 views
5

Ich habe ein Wörterbuch von Zootieren. Ich möchte es in einem verschachtelten Wörterbuch in das Wörterbuch einfügen, aber einen KeyError erhalten, weil diese bestimmte Spezies dem Wörterbuch nicht hinzugefügt wurde.Kurzschreibweise zum Erstellen eines Wörterbuchschlüssels, wenn dieser nicht existiert

def add_to_world(self, species, name, zone = 'retreat'): 
    self.object_attr[species][name] = {'zone' : zone} 

Gibt es eine Verknüpfung zu überprüfen, ob die Spezies im Wörterbuch enthalten ist, und es schaffen, wenn sie nicht oder haben sind, ich es den langen Weg zu machen und manuell überprüfen, ob diese Art hinzugefügt wurde?

+1

Hat eine Art wahrscheinlich mehr als einen Namen? –

Antwort

13
def add_to_world(self, species, name, zone = 'retreat'): 
    self.object_attr.setdefault(species, {})[name] = {'zone' : zone} 
+0

Ich bekomme einen "SyntaxError" -Fehler, wenn ich 'print {} .setdefault ('species', {}) ['name'] = {'zone': 'thezone'}'. Was ich hier falsch verstehe ? – kramer65

+0

Zuweisung ist kein Ausdruck in Python und kann nicht in einer 'print' Anweisung verwendet werden – kindall

+0

Das heißt, Sie müssen etwas tun wie' d = {}; d.setdefault ('species', {}) [ 'name'] = {'zone': 'thezone'}; print d' – kindall

9

Die Autovivi- zierung von Wörterbuchwerten kann unter collections.defaultdict durchgeführt werden.

+3

Danke für das Wort - Autovivication. – sri

+0

Nur hässlich auf Druck: defaultdict ( bei 0x02379DF0>, {'2013-11-29': defaultdict (, {'USG': D ... – gseattle

+0

ist dort eine relativ nicht-obskure Äquivalent dieses Wortes en espanol? – javadba

9

Hier ist ein Beispiel für die Verwendung von defaultdict mit einem Wörterbuch als Wert.

>>> from collections import defaultdict 
>>> d = defaultdict(dict) 
>>> d["species"]["name"] = {"zone": "1"} 
>>> d 
defaultdict(<type 'dict'>, {'species': {'name': {'zone': '1'}}}) 
>>> 

Wenn Sie weiter wollen nisten Sie eine Funktion defaultdict vornehmen müssen werden (dict) zurückzukehren.

def nested_defaultdict(): 
    return defaultdict(dict) 

# Then you can use a dictionary nested to 3 levels 
d2 = defaultdict(nested_defaultdict) 
d2["species"]["name"]["zone"] = 1 
+0

+1 für verschachtelte Standarddiktate – linkyndy

Verwandte Themen