Saltar al contenido

¿Cómo funciona collections.defaultdict?

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])

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *