Hacemos una revisión completa cada una de las reseñas en nuestro sitio web con el objetivo de enseñarte siempre información más veraz y certera.
Solución:
Por lo general, un diccionario de Python arroja un KeyError
si intenta conseguir un artículo con un key que no está actualmente en el diccionario. los defaultdict
por el contrario, simplemente creará cualquier elemento al que intente acceder (siempre que, por supuesto, aún no exista). Para crear un elemento “predeterminado” de este tipo, llama al objeto de función que pasa al constructor (más precisamente, es un objeto “invocable” arbitrario, que incluye objetos de tipo y función). Para el primer ejemplo, los elementos predeterminados se crean utilizando int()
que devolverá el objeto entero 0
. Para el segundo ejemplo, los elementos predeterminados se crean utilizando list()
que devuelve un nuevo objeto de lista vacía.
defaultdict
significa que si un key no se encuentra en el diccionario, entonces en lugar de un KeyError
siendo lanzado, se crea una nueva entrada. El tipo de esta nueva entrada viene dado por el argumento de defaultdict.
Por ejemplo:
somedict =
print(somedict[3]) # KeyError
someddict = defaultdict(int)
print(someddict[3]) # print int(), thus 0
predeterminadodict
“El diccionario estándar incluye el método setdefault() para recuperar un valor y establecer un valor predeterminado si el valor no existe. Por el contrario, defaultdict
permite que la persona que llama especifique el valor predeterminado (valor que se devolverá) por adelantado cuando se inicializa el contenedor”.
Según lo definido por Doug Hellmann en La biblioteca estándar de Python por ejemplo
Cómo usar el dictado predeterminado
Importar dictamen predeterminado
>>> from collections import defaultdict
Inicializar dictado predeterminado
Inicializarlo pasando
invocable como su primer argumento (obligatorio)
>>> d_int = defaultdict(int)
>>> d_list = defaultdict(list)
>>> def foo():
... return 'default value'
...
>>> d_foo = defaultdict(foo)
>>> d_int
defaultdict(, )
>>> d_list
defaultdict(, )
>>> d_foo
defaultdict(, )
**kwargs como su segundo argumento (opcional)
>>> d_int = defaultdict(int, a=10, b=12, c=13)
>>> d_int
defaultdict(, 'a': 10, 'c': 13, 'b': 12)
o
>>> kwargs = 'a':10,'b':12,'c':13
>>> d_int = defaultdict(int, **kwargs)
>>> d_int
defaultdict(, 'a': 10, 'c': 13, 'b': 12)
Cómo funciona
Como es una clase secundaria del diccionario estándar, puede realizar todas las mismas funciones.
Pero en caso de pasar un desconocido key devuelve el valor predeterminado en lugar de error. Por ejemplo:
>>> d_int['a']
10
>>> d_int['d']
0
>>> d_int
defaultdict(, 'a': 10, 'c': 13, 'b': 12, 'd': 0)
En caso de que desee cambiar el valor predeterminado, sobrescriba default_factory:
>>> d_int.default_factory = lambda: 1
>>> d_int['e']
1
>>> d_int
defaultdict( at 0x7f34a0a91578>, 'a': 10, 'c': 13, 'b': 12, 'e': 1, 'd': 0)
o
>>> def foo():
... return 2
>>> d_int.default_factory = foo
>>> d_int['f']
2
>>> d_int
defaultdict(, 'a': 10, 'c': 13, 'b': 12, 'e': 1, 'd': 0, 'f': 2)
Ejemplos en la pregunta
Ejemplo 1
Como int se ha pasado como default_factory, cualquier desconocido key devolverá 0 por defecto.
Ahora como el string se pasa en el bucle, aumentará la cuenta de esos alfabetos en d.
>>> s = 'mississippi'
>>> d = defaultdict(int)
>>> d.default_factory
>>> for k in s:
... d[k] += 1
>>> d.items()
[('i', 4), ('p', 2), ('s', 4), ('m', 1)]
>>> d
defaultdict(, 'i': 4, 'p': 2, 's': 4, 'm': 1)
Ejemplo 2
Como se ha pasado una lista como default_factory, cualquier desconocido (inexistente) key regresará [ ](es decir, lista) por defecto.
Ahora, a medida que la lista de tuplas se pasa en el ciclo, agregará el valor en el d[color]
>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> d.default_factory
>>> for k, v in s:
... d[k].append(v)
>>> d.items()
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
>>> d
defaultdict(, 'blue': [2, 4], 'red': [1], 'yellow': [1, 3])