Ya conoces las listas y los diccionarios. Ahora aprenderás a obtener vistas útiles de una colección: artículos agotados, nombres ordenados y códigos repetidos. La pregunta principal será qué operación necesitas y si debe modificar el original. Elegir con criterio una estructura de datos evita escribir bucles difíciles de mantener.
Partir de registros pequeños
Guarda los siguientes datos en practica_colecciones.py. Cada diccionario describe un artículo completo. La lista conserva el orden en que escribiste los registros pero ese orden no representa necesariamente el que quieres mostrar al consultar. Es importante no atribuir significado a una posición si tu programa no lo ha definido.
articulos = [
{"codigo": "LA001", "nombre": "Lápiz", "cantidad": 0},
{"codigo": "CU001", "nombre": "Cuaderno", "cantidad": 3},
{"codigo": "CA001", "nombre": "Carpeta", "cantidad": 2},
agotados = [a for a in articulos if a["cantidad"] == 0] ordenados = sorted(articulos, key=lambda a: a["nombre"].casefold()) print([a["codigo"] for a in agotados]) print([a["nombre"] for a in ordenados]) «`
La primera salida contiene LA001. La segunda muestra Carpeta, Cuaderno y Lápiz. La comprensión de lista crea una nueva lista seleccionando registros que cumplen una condición. Puedes escribir exactamente la misma lógica con un bucle y append. Utiliza la forma que puedas leer con facilidad: abreviar no mejora un programa si dificulta entenderlo.
Leer una comprensión sin adivinar
La estructura «expresión for elemento in colección if condición» tiene tres partes. Primero considera cada elemento. Después decide si cumple la condición. Finalmente produce la expresión que irá a la lista nueva. En agotados la expresión es el propio diccionario. En la salida de códigos la expresión es una de sus propiedades.
Evita meter varias transformaciones y condiciones complicadas dentro de una única línea. Si necesitas comprobar un nombre, convertir una cantidad y registrar un error tendrás un proceso con varios pasos. Un bucle ordinario será más apropiado. Las comprensiones resultan especialmente claras cuando su objetivo cabe en una frase: «los códigos de los artículos sin existencias».
Ordenar una copia de la lista
sorted devuelve una lista nueva. El método sort modifica la lista sobre la que actúa y devuelve None. Por eso articulos = articulos.sort() es un error: perderías la referencia a la lista al guardar None. Cuando quieras presentar una vista ordenada y conservar la secuencia original utiliza sorted.
La función pequeña introducida por lambda indica la clave de ordenación. Aquí toma el nombre convertido con casefold. No aplica un orden alfabético específico del español: el orden depende de las cadenas Unicode resultantes. Para este inventario es suficiente. En un catálogo profesional podrías necesitar reglas lingüísticas más elaboradas y tendrías que comprobarlas expresamente.
Una lista nueva no implica diccionarios nuevos. Tanto agotados como articulos pueden contener referencias al mismo diccionario. Si modificas agotados[0]["cantidad"] también cambiará ese registro al consultarlo a través de articulos. Es una copia superficial de la estructura exterior. Lo veremos con más detalle al diseñar funciones que no modifican sus entradas.
Utilizar conjuntos para responder sobre pertenencia
Un conjunto guarda elementos únicos y permite preguntar si un valor ya aparece. No debes usar su orden como orden de presentación. Para detectar códigos repetidos en una importación utilizaremos un conjunto de códigos vistos. Añadiremos cada código solo después de comprobar que todavía no estaba presente.
vistos = set()
for articulo in articulos:
codigo = articulo["codigo"]
if codigo in vistos:
print("Repetido:", codigo)
vistos.add(codigo)
Crear directamente un conjunto con todos los códigos elimina duplicados pero no te informa de qué filas los contenían. Para emitir un mensaje preciso necesitas recorrer los registros y conservar contexto. El conjunto es una herramienta para comprobar pertenencia, no un sustituto de la validación del archivo completo.
Acceder por código con un diccionario
Puedes construir un índice en memoria que relacione cada código con su artículo. La consulta será más directa que recorrer una lista cada vez. Sin embargo, si repites una clave durante la construcción el valor anterior se sustituye. Por eso debes comprobar duplicados antes de crear el índice cuando perder un registro sería un error.
No necesitas convertir cada lista en un diccionario. Si vas a recorrer todos los artículos una vez la lista es suficiente. Si realizas numerosas búsquedas por código el índice puede resultar útil. La elección depende de las operaciones y de la claridad del código. Para cantidades pequeñas de datos la facilidad de revisión suele importar más que pequeñas diferencias de velocidad.
Errores habituales
Modificar una lista mientras la recorres puede saltarse elementos. Si necesitas eliminar agotados crea una nueva lista con los que quieres conservar. También es fácil confundir el número de artículos con el número de unidades: len(articulos) vale tres pero las cantidades suman cinco. Pon nombres que distingan ambas magnitudes.
Por último, no sustituyas una condición clara por una expresión rebuscada. Comprobar cantidad == 0 comunica una regla exacta. Comprobar not cantidad puede aceptar otros valores vacíos si tu validación falla. El inventario trabajará con cantidades enteras y aun así conviene que la intención quede visible en el código.
Una comprobación adicional
Si quieres presentar los códigos de un conjunto utiliza sorted sobre ese conjunto. Obtendrás una lista con un orden explícito. Así evitas que una comprobación dependa del orden accidental de una estructura diseñada principalmente para representar pertenencia.
Lo que deberías recordar
- Una comprensión debe seguir siendo legible.
- sorted crea una lista nueva.
- Los conjuntos detectan pertenencia y duplicados.
- Una lista nueva puede compartir los diccionarios originales.
Ejercicio práctico
Añade un artículo nuevo con cantidad cero. Obtén una lista con los códigos agotados y otra con los nombres de los artículos que tienen al menos dos unidades. Predice ambas salidas antes de ejecutar. Comprueba además que el orden de articulos no cambia después de llamar a sorted.
Introduce deliberadamente un segundo registro con el código CU001. Adapta el recorrido con vistos para informar del duplicado. No lo soluciones convirtiendo toda la lista en un conjunto porque los diccionarios no se pueden usar directamente como elementos de un conjunto y además perderías contexto.
Termina escribiendo dos resultados distintos: número de registros y suma de unidades. En el cuaderno explica por qué representan cosas diferentes. Si ordenas una lista filtrada y cambias después un diccionario compartido anota dónde aparece el cambio. Este pequeño experimento te preparará para el siguiente capítulo.
Siguiente: Diseñar funciones que puedas probar.








