2012-06-01 8 views
5

Tengo un diccionario de animales de zoológico. Quiero ponerlo en el diccionario en un diccionario anidado pero obtengo un KeyError porque esa especie en particular no se ha agregado al diccionario.forma abreviada para crear la clave del diccionario si no existe

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

¿Hay un acceso directo a la comprobación de si la especie se encuentra en el diccionario y crearlo si no lo es, o tengo que hacerlo de la manera larga y comprobar manualmente si es que las especies se ha añadido?

+1

¿Es probable que una especie tenga más de un nombre? –

Respuesta

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

Me aparece un error 'SyntaxError' cuando intento' print {} .setdefault ('species', {}) ['name'] = {'zone': 'thezone'} '. Lo que estoy malentendiendo aquí ? – kramer65

+0

La asignación no es una expresión en Python y no se puede usar en una declaración 'print' – kindall

+0

Es decir, tienes que hacer algo como' d = {}; d.setdefault ('species', {}) [ 'name'] = {'zone': 'thezone'}; print d' – kindall

9

La autovigilancia de los valores del diccionario se puede realizar por collections.defaultdict.

+3

Gracias por la palabra - Autovivication. – sri

+0

Simplemente feo en la impresión: defaultdict ( en 0x02379DF0>, {'2013-11-29': defaultdict (, {'USG': D ... – gseattle

+0

) hay un equivalente relativamente no oscuro de esa palabra en espanol? – javadba

9

Aquí hay un ejemplo de uso de default con un diccionario como valor.

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

si quieres anidación más tendrá que hacer una función para volver defaultdict (dict).

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 para los valores predeterminados anidados – linkyndy

Cuestiones relacionadas