import collections
a = collections.defaultdict(lambda: 3)
a.update({'one':1,'two':2})
print a['three']
emite 3
según sea necesario. También podría subclase dict
mismo y anular __missing__
, pero eso no tiene mucho sentido cuando el comportamiento defaultdict
(haciendo caso omiso de la llave perdida exacta que está siendo alzó la vista) que se adapte tan bien ...
Editar ... , a menos que, es decir, está preocupado por a
creciendo cada vez que busca una clave faltante (que es parte de la semántica de defaultdict
) y prefiere obtener un comportamiento más lento pero ahorrar algo de memoria. Por ejemplo, en términos de memoria ...:
>>> import sys
>>> a = collections.defaultdict(lambda: 'blah')
>>> print len(a), sys.getsizeof(a)
0 140
>>> for i in xrange(99): _ = a[i]
...
>>> print len(a), sys.getsizeof(a)
99 6284
... la defaultdict, inicialmente vacío, ahora tiene el 99 llaves previamente faltantes que miramos hacia arriba, y tiene 6284 bytes (frente a los 140 bytes tomó cuando estaba vacío).
El enfoque alternativo ...:
>>> class mydict(dict):
... def __missing__(self, key): return 3
...
>>> a = mydict()
>>> print len(a), sys.getsizeof(a)
0 140
>>> for i in xrange(99): _ = a[i]
...
>>> print len(a), sys.getsizeof(a)
0 140
... ahorra completo esta sobrecarga de la memoria, como ves. Por supuesto, el rendimiento es otra cuestión:
$ python -mtimeit -s'import collections; a=collections.defaultdict(int); r=xrange(99)' 'for i in r: _=a[i]'
100000 loops, best of 3: 14.9 usec per loop
$ python -mtimeit -s'class mydict(dict):
> def __missing__(self, key): return 0
> ' -s'a=mydict(); r=xrange(99)' 'for i in r: _=a[i]'
10000 loops, best of 3: 92.9 usec per loop
Desde defaultdict
añade la tecla (previamente perdidos) en las operaciones de búsqueda, se hace mucho más rápido cuando dicha clave está próxima la mirada, mientras mydict
(que anula __missing__
para evitar que Además) paga la "sobrecarga de búsqueda de clave faltante" cada vez.
Si usted se preocupa por cualquier problema (rendimiento vs huella de memoria) depende completamente de su caso de uso específico, por supuesto. Se es en cualquier caso una buena idea estar al tanto de la desventaja -)
'collections.defaultdict' es su solución con pilas incluidas. –
+1 para el título de pregunta –