1. Faro

Nivel 5 · Filtra productos en una línea

La solicitud

De Thomas Whitaker, Director de Merchandising

“Para el correo «Ilumina tus tardes» necesito los nombres de nuestros productos de iluminación de menos de $100. Mantenlos en el orden en que aparecen en el catálogo.”

Tu objetivo

Asigna a result una lista con los valores de name de los productos cuya categoría es 'Lighting' y cuyo precio es menor que 100, en el mismo orden que en products.

  • Guarda una lista de 3 en resultpendiente

Tu código

Python

Cargando el editor…

    ResultadoPresiona Ejecutar para ver el tuyo

    Mote revisa tu resultado

    Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.

    La lección

    Una lista de diccionarios es una tabla

    Mira products: una lista donde cada elemento es un diccionario con las mismas claves. Eso es una tabla disfrazada. Cada diccionario es una fila y cada clave es una columna. También es exactamente la forma que obtienes de la mayoría de las APIs web y los archivos JSON, así que la verás a menudo antes de que los datos lleguen a pandas.

    La forma con bucle

    Ya sabes filtrar con un bucle y un acumulador:

    names = []
    for p in products:
        if p["category"] == "Lighting" and p["price"] < 100:
            names.append(p["name"])

    Cuatro líneas, y la intención real (conservar los nombres de la iluminación barata) está repartida en todas ellas.

    La forma con comprehension

    Una list comprehension dice lo mismo en una sola expresión:

    names = [p["name"] for p in products if p["category"] == "Lighting" and p["price"] < 100]

    Léela en tres partes:

    1. p["name"]: lo que entra en la lista nueva.
    2. for p in products: de dónde vienen los elementos.
    3. if ...: qué elementos conservar (opcional).

    El resultado es siempre una lista nueva. El orden se conserva, porque recorre products de principio a fin. Para condiciones largas, repartirlas en varias líneas dentro de los corchetes es perfectamente válido y más fácil de leer.

    Transformar además de filtrar

    La primera parte puede ser cualquier expresión, así que las comprehensions también remodelan datos:

    [p["price"] * 0.8 for p in products]                 # every price with 20% off
    [p["name"].upper() for p in products]                # names in capitals
    [round(p["price"] * 1.08, 2) for p in products if p["category"] == "Kitchen"]

    También hay comprehensions de diccionario, que construyen una tabla de búsqueda de una vez:

    price_by_name = {p["name"]: p["price"] for p in products}
    price_by_name["Oak Side Table"]    # 149.0

    Cuidado con el límite

    «Menos de $100» significa estrictamente por debajo, así que < 100. El Edison Bulb Pack de exactamente 100.00 debe quedar fuera, y el Glass Wall Sconce de 99.99 debe quedarse. Cuando un encargo dice «hasta» o «como máximo», eso se convierte en <=. Lee con cuidado la redacción; los valores del borde son justo lo que revisan los revisores.

    Cuándo no usarla

    Las comprehensions sirven para construir una lista. Si necesitas varios pasos por elemento, manejo de errores, o ni siquiera estás recogiendo resultados (solo imprimiendo, por ejemplo), un bucle normal es más claro. Una comprehension que necesita barra de desplazamiento para leerse es señal de volver a un bucle.

    Errores comunes

    • Poner el if antes del for. [p["name"] if ... for p in products] es otra construcción (un if-else en línea) y falla sin un else.
    • Comparar la categoría con otra capitalización, como "lighting", que no coincide con nada.
    • Escribir p.name en lugar de p["name"]. Los valores de un diccionario se leen con corchetes.

    Una mirada hacia delante

    En pandas todo este nivel se convierte en products.loc[(products["category"] == "Lighting") & (products["unit_price"] < 100), "name"]. La misma idea, aplicada a una columna entera de una vez.

    Elige qué puede ejecutarse en este sitio. Puedes cambiarlo cuando quieras desde "Configurar cookies", al pie de cada página.