Python ‐ Mejores practicas (Diccionarios y Conjuntos) - DavSeb21031990/plan-estudio-python-go GitHub Wiki

Entender cuándo usar diccionarios y cuándo usar sets es clave para escribir código eficiente y legible. Aunque ambos utilizan llaves {} en su sintaxis de creación (con la excepción del set vacío set()), sus propósitos y funcionalidades son muy diferentes. Vamos a desglosar las buenas prácticas para cada uno:

Cuándo usar Diccionarios (Mapeo Clave-Valor)

Los diccionarios son ideales cuando necesitas asociar un valor a una clave específica para un acceso rápido y directo. Piénsalos como un índice o un glosario, donde cada palabra (clave) te lleva a su definición (valor). Situaciones donde los diccionarios son la mejor opción:

  1. Almacenar información estructurada con etiquetas:
    • Perfiles de usuario: {"nombre": "Ana", "edad": 30, "email": "[email protected]"}
    • Configuraciones: {"base_datos": "produccion", "puerto": 5432, "debug": False}
    • Datos de productos: {"id": "P001", "nombre": "Laptop", "precio": 1200.00, "stock": 50}
  2. Acceso rápido a datos por un identificador único:
    • Si tienes una lista de objetos y necesitas acceder a ellos por su ID. En lugar de iterar la lista, puedes ponerlos en un diccionario donde la clave sea el ID.
      usuarios_lista = [{"id": 1, "nombre": "Alice"}, {"id": 2, "nombre": "Bob"}]
      usuarios_dict = {u["id"]: u for u in usuarios_lista}
      # Para encontrar a Bob: usuarios_dict[2] -> {"id": 2, "nombre": "Bob"}
      
    • Caché de datos, donde buscas un valor por su "nombre" o "código".
  3. Contar la frecuencia de elementos:
    • Puedes usar un diccionario para llevar la cuenta de cuántas veces aparece cada elemento en una lista.
      frutas = ["manzana", "banana", "manzana", "naranja", "banana", "manzana"]
      conteo = {}
      for fruta in frutas:
          conteo[fruta] = conteo.get(fruta, 0) + 1
      # conteo será: {'manzana': 3, 'banana': 2, 'naranja': 1}
      
  4. Simular estructuras de datos complejas:
    • Grafos (nodos y aristas), donde los nodos pueden ser claves que apuntan a listas de sus nodos adyacentes.
    • Árboles (simulando nodos padre-hijo).
  5. Cuando el orden de inserción es relevante (Python 3.7+):
    • Aunque tradicionalmente los diccionarios no garantizaban el orden, a partir de Python 3.7 sí lo hacen (mantienen el orden en que se insertaron las claves). Si esto es un requisito, un diccionario aún podría ser una opción. En resumen, usa diccionarios cuando:
  • Necesitas almacenar pares clave: valor.
  • El acceso a los datos se realiza principalmente a través de una clave única.
  • El nombre o la etiqueta del dato es tan importante como el dato mismo.

Cuándo usar Sets (Colecciones Únicas, Operaciones Matemáticas de Conjuntos)

Los sets son ideales cuando tu principal preocupación es tener una colección de elementos únicos y realizar operaciones de lógica de conjuntos (unión, intersección, diferencia). Piénsalos como una forma de filtrar duplicados o comparar colecciones de forma eficiente. Situaciones donde los sets son la mejor opción:

  1. Eliminar elementos duplicados de una colección:
    • Esta es una de las aplicaciones más comunes. Si tienes una lista con muchos elementos repetidos y solo quieres los únicos:
      numeros_duplicados = [1, 2, 2, 3, 4, 4, 5, 1]
      numeros_unicos = set(numeros_duplicados)
      print(numeros_unicos) # Salida: {1, 2, 3, 4, 5}
      
  2. Verificar rápidamente la pertenencia de un elemento:
    • Comprobar si un elemento está en un set es extremadamente rápido (tiempo promedio O(1)). Si necesitas hacer muchas verificaciones de elemento in coleccion, un set es más eficiente que una lista grande.
      usuarios_activos = {"juan", "maria", "pedro"}
      nombre = "juan"
      if nombre in usuarios_activos:
          print(f"{nombre} está activo.") # Salida: juan está activo.
      
  3. Realizar operaciones de conjuntos (Unión, Intersección, Diferencia, etc.):
    • Unión: Combinar elementos de varias colecciones y eliminar duplicados.
      estudiantes_curso_a = {"Ana", "Pedro", "Luis"}
      estudiantes_curso_b = {"Maria", "Luis", "Sofía"}
      todos_estudiantes = estudiantes_curso_a.union(estudiantes_curso_b)
      print(todos_estudiantes) # Salida: {'Sofía', 'Pedro', 'Ana', 'Maria', 'Luis'}
      
    • Intersección: Encontrar elementos comunes entre colecciones.
      premium_users = {"juan", "maria", "pedro"}
      newsletter_subscribers = {"maria", "carlos", "pedro", "ana"}
      comunes = premium_users.intersection(newsletter_subscribers)
      print(comunes) # Salida: {'maria', 'pedro'}
      
    • Diferencia: Encontrar elementos que están en una colección pero no en otra.
      tareas_completadas = {"tarea1", "tarea2", "tarea3"}
      todas_las_tareas = {"tarea1", "tarea2", "tarea3", "tarea4", "tarea5"}
      tareas_pendientes = todas_las_tareas.difference(tareas_completadas)
      print(tareas_pendientes) # Salida: {'tarea4', 'tarea5'}
      
    • Verificar si son disjuntos (no tienen elementos en común).
    • Verificar si un set es subconjunto o superconjunto de otro.
  4. Almacenar un grupo de "flags" o etiquetas únicas:
    • Si necesitas un conjunto de características o permisos únicos asociados a algo.
      permisos_usuario = {"lectura", "escritura", "edicion"}
      

En resumen, usa sets cuando:

  • Solo te importan los elementos únicos de una colección.
  • Necesitas verificar rápidamente si un elemento existe en una colección.
  • Vas a realizar operaciones lógicas de conjuntos entre diferentes colecciones de datos.
  • El orden de los elementos no es relevante.

Errores Comunes y Consideraciones

  • Crear un set vacío: Recuerda siempre usar set() para un set vacío, no {} (que crea un diccionario vacío).
  • Elementos mutables en sets: Los elementos de un set deben ser inmutables (números, cadenas, tuplas). No puedes almacenar listas o diccionarios directamente dentro de un set. Si intentas hacerlo, obtendrás un error TypeError.
  • Orden: Los sets no mantienen el orden de inserción (aunque las representaciones pueden parecer ordenadas para ciertos tipos de datos en Python, no es una garantía). Si el orden es crucial, usa una lista o un diccionario (Python 3.7+). Al elegir entre diccionarios y sets, pregúntate:
  • ¿Necesito asociar un valor a cada elemento? Si la respuesta es sí, usa un diccionario.
  • ¿Solo necesito una colección de elementos únicos y/o realizar operaciones de conjuntos? Si la respuesta es sí, usa un set.