Comprobar si existen todas las keys en un diccionario de Python | Programador Web Valencia

Comprobar si existen todas las keys en un diccionario de Python

2 minutos

Check con Python

En algunas ocasiones debemos validar que un diccionario posea ciertas claves, o keys, existan antes de continuar nuestra lógica. Sino podría fallar la ejecución. Pero la pregunta es… ¿cómo lo podemos hacer de la forma más limpia posible?

Para los ejemplos partimos del siguiente diccionario.

party = {
    "name": "Bob",
    "age": 20,
    "city": "London",
    "country": "UK",
	"web": "http://example.com",
	"twitter": "@bob",
}

Mi objetivo: Quiero un bool en True si esta presente todas las claves. En mi caso verificaré name, age, city y country. En caso que falte tan solo una de ellas, obtendré un False.

Solución 1: Una larga condicinal

La típica resolución, la más fácil, ante el problema es una condicional.

if "name" in party and "country" in party and "age" in party and "city" in party:
    print("Los campos requeridos están presentes")
else:
    print("NO todos los campos requeridos están presentes")

# "Los campos requeridos están presentes"

No es perfecta, ya que es verboso y difícil de leer.

Solución 2: set apoyada por issubset

Es más elegante, sin duda alguna, crear un elemento iterable con todas las keys que necesitas comprobar para a continuación comprobar cada item por separado.

  • .keys() nos devolverá el listado con las claves del diccionario.
  • set() eliminará cualquier repetición.
  • issubset es una funcionalidad de set que comprobará si el listado actual corresponde a todos los valores del argumento (party.keys()).
required_fields = ["name", "country", "age", "city"]
is_all_included = set(required_fields).issubset(party.keys())


if is_all_included:
    print("Los campos requeridos están presentes")
else:
    print("NO todos los campos requeridos están presentes")

# "Los campos requeridos están presentes"

Solución 3: Crear una función propia usando la lógica anterior

Si el código te ha parecido lo suficientemente interesante, el siguiente paso es crear una función reutilizable, bien documentada y con tipos definidos.

from typing import Mapping, Iterable, Any


def is_all_included(data: Mapping[str, Any], fields: Iterable[str]) -> bool:
    """Comprueba si todos los campos están presentes en el diccionario

    Args:
        data (dict): Diccionario a comprobar
        fields (list|tuple): Campos a comprobar

    Returns:
        bool: True si todos los campos están presentes, False en caso contrario
    """
    return set(fields).issubset(data.keys())


if is_all_included(party, ["name", "country", "age", "city"]):
    print("Los campos requeridos están presentes")
else:
    print("NO todos los campos requeridos están presentes")

# "Los campos requeridos están presentes"

Mucho más práctico y fácil de testear.

Conclusión

Evitemos siempre que sea posible enormes condicionales costosas de mantener o imposible de reutilizar. Como puedes ver en los ejemplos, puedes construir una pequeña utilidad que resuelva el problema planteado y tal vez muchos otros en un futuro. Por otro lado no menosprecies todo lo que aprenderás por el camino. La curiosidad es un arma muy poderosa en la profesión.

Esta obra está bajo una Licencia Creative Commons Atribución-NoComercial-SinDerivadas 4.0 Internacional.

Atribución/Reconocimiento-NoComercial-SinDerivados 4.0 Internacional

¿Me ayudas?

Comprame un café
Pulsa sobre la imagen

No te sientas obligado a realizar una donación, pero cada aportación mantiene el sitio en activo logrando que continúe existiendo y sea accesible para otras personas. Además me motiva a crear nuevo contenido.

Comentarios

{{ comments.length }} comentarios

Nuevo comentario

Nueva replica  {{ formatEllipsisAuthor(replyComment.author) }}

Acepto la política de Protección de Datos.

Escribe el primer comentario

Tal vez también te interese...