Uso de defaultdict en Python

Zeeshan Afridi 8 octubre 2023
  1. defaultdict vs dict en Python
  2. el dictado por defecto en Python
  3. Funciones útiles del defaultdict en Python
Uso de defaultdict en Python

El artículo de hoy analiza el contenedor defaultdict y demuestra su uso mediante ejemplos de código.

defaultdict vs dict en Python

El defaultdict es un contenedor como un diccionario que pertenece al módulo de colecciones. Es una subclase del diccionario; de ahí que tenga todas las funcionalidades de diccionario. Sin embargo, el único propósito de defaultdict es manejar el KeyError.

# return true if the defaultdict is a subclass of dict (dictionary)
from collections import defaultdict

print(issubclass(defaultdict, dict))

Producción :

True

Digamos que un usuario busca una entrada en el diccionario, y la entrada buscada no existe. Los diccionarios ordinarios generarán un KeyError, lo que significa que la entrada no existe. Para superar este problema, los desarrolladores de Python presentaron el concepto de defaultdict.

Ejemplo de código:

# normal dictionary
ord_dict = {"x": 3, "y": 4}

ord_dict["z"]  # --> KeyError

Producción :

KeyError: 'z'

El diccionario ordinario no puede manejar “claves” desconocidas, y arroja KeyError cuando buscamos una “clave” desconocida, como se demuestra en el código anterior.

Por otro lado, el módulo defaultdict funciona de manera similar a los diccionarios de Python. Aún así, tiene funciones avanzadas, útiles y fáciles de usar y no arroja un error cuando un usuario busca una clave indefinida en el diccionario.

Pero en cambio, crea una entrada en el diccionario y devuelve un valor predeterminado contra la clave. Para entender este concepto, veamos la parte práctica a continuación.

Ejemplo de código:

from collections import defaultdict

# the default value for the undefined key


def def_val():
    return "The searched Key Not Present"


dic = defaultdict(def_val)

dic["x"] = 3
dic["y"] = 4

# search 'z' in the dictionary 'dic'
print(dic["z"])  # instead of a KeyError, it has returned the default value
print(dic.items())

Producción :

The searched Key Not Present
dict_items([('x', 3), ('y', 4), ('z', 'The searched Key Not Present')])

El defaultdict crea cualquier elemento al que intentemos acceder con la clave, que no está definida en el diccionario.

Y crea un elemento predeterminado de este tipo, llama al objeto de función que le pasamos al constructor de defaultdict, y para ser más precisos, el objeto debe ser un objeto invocable que incluya objetos de tipo y funciones.

En el ejemplo anterior, los elementos predeterminados se crean con la función def_val que devuelve una cadena La clave buscada no está presente contra la clave indefinida en el diccionario.

el dictado por defecto en Python

El default_factory es el primer argumento del constructor defaultdict que utiliza el método __missing__(), y si falta el argumento del constructor, default_factory se inicializará como Ninguno, lo que surgir el KeyError.

Y si default_factory se inicializa con algo que no sea “Ninguno”, se asignará como un “valor” a una “clave” buscada como se ve en el ejemplo anterior.

Funciones útiles del defaultdict en Python

Hay toneladas de funciones de diccionario y defaultdict. Como sabemos, el dictador por defecto tiene acceso a todas las funciones del diccionario; sin embargo, estas son algunas de las funciones más útiles específicas de defaultdict.

defaultdict.clear() en Python

Ejemplo de código:

from collections import defaultdict

# the default value for the undefined key


def def_val():
    return "Not Present"


dic = defaultdict(def_val)

dic["x"] = 3
dic["y"] = 4

print(f'Before clearing the dic, values of x = {dic["x"]} and y = {dic["y"]}')
dic.clear()  # dic.clear() -> None. it will remove all items from dic.
print(f'After clearing the dic, values of x = {dic["x"]} and y = {dic["y"]}')

Producción :

Before clearing the dic, values of x = 3 and y = 4
After clearing the dic, values of x = Not Present and y = Not Present

Como vemos en el ejemplo anterior, tenemos dos pares de datos en el diccionario dic donde x=3 e y=4. Sin embargo, después de usar la función clear(), los datos se eliminaron y los valores de x e y ya no existen, y es por eso que estamos obteniendo Not present contra x e y.

defaultdict.copy() en Python

Ejemplo de código:

from collections import defaultdict

# the default value for the undefined key


def def_val():
    return "Not Present"


dic = defaultdict(def_val)

dic["x"] = 3
dic["y"] = 4

dic_copy = dic.copy()  # dic.copy will give you a shallow copy of dic.

print(f"dic = {dic.items()}")
print(f"dic_copy = {dic_copy.items()}")

Producción :

dic = dict_items([('x', 3), ('y', 4)])
dic_copy = dict_items([('x', 3), ('y', 4)])

La función defaultdict.copy() se usa para copiar una copia superficial del diccionario en otra variable que podemos usar en consecuencia.

defaultdict.default_factory() en Python

Ejemplo de código:

from collections import defaultdict

# the default value for the undefined key


def def_val():
    return "Not present"


dic = defaultdict(def_val)

dic["x"] = 3
dic["y"] = 4

print(f"The value of z = {dic['Z']}")
print(
    dic.default_factory()
)  # default_factory returns the default value for defaultdict.

Producción :

The value of z = Not present
Not present

La función default_factory() se utiliza para proporcionar valores predeterminados a los atributos de una clase definida y, en general, los valores de default_factory son los valores devueltos por una función.

defaultdict.get(clave, valor predeterminado) en Python

Ejemplo de código:

from collections import defaultdict

# the default value for the undefined key


def def_val():
    return "Not present"


dic = defaultdict(def_val)

dic["x"] = 3
dic["y"] = 4

# search the value of Z in the dictionary dic; if it exists, return the value; otherwise, display the message
print(dic.get("Z", "Value doesn't exist"))  # default value is None

Producción :

Value doesn't exist

La función defaultdict.get() toma dos argumentos, primero es la clave, y el segundo es el valor predeterminado contra la clave en caso de que el valor no exista.

Pero el segundo argumento es opcional. Entonces podemos especificar cualquier mensaje o valor; de lo contrario, mostrará Ninguno como valor predeterminado.

Zeeshan Afridi avatar Zeeshan Afridi avatar

Zeeshan is a detail oriented software engineer that helps companies and individuals make their lives and easier with software solutions.

LinkedIn