DMarlon Studio

Lección 3 · 3 de 20

Lambdas, sorted, map y filter · Python

Ordene, filtre y transforme datos en Python con funciones lambda, sorted(key=...), map y filter, sobre un catálogo de productos.

Python · Lambdas, sorted, map y filter en DMarlon Studio: el código del ejemplo y su salida en la terminal

Una lambda es una función pequeña sin nombre: lambda price: round(price * 1.21, 2) recibe un precio y devuelve el precio con IVA. Solo admite una expresión, sin return. El programa la guarda en vat para enseñarla, aunque lo normal es escribirla directamente donde se usa.

sorted(products, key=lambda p: p["price"]) ordena los diccionarios por precio: key es la función que dice qué hay que comparar de cada elemento. Devuelve una lista nueva y deja products como estaba.

Para ordenar por varios criterios, la clave devuelve una tupla: (-p["price"], p["name"]) ordena de más caro a más barato (el signo menos invierte el orden) y, si dos precios empatan, por nombre. Por eso Desk sale antes que Monitor. max() y min() aceptan el mismo key=.

filter(función, datos) se queda con los elementos para los que la función devuelve True (aquí, los que tienen existencias) y map(función, datos) aplica la función a cada uno. Las dos son perezosas: no hacen nada hasta que se recorren, por eso el programa las convierte con list() o las recorre en una comprensión.

map acepta cualquier función, no solo lambdas: map(str.upper, ...) usa el método de las cadenas y map(vat, ...) reutiliza la lambda guardada.

Código · main.py

products = [    {"name": "Laptop", "price": 899.0, "stock": 4},    {"name": "Mouse", "price": 15.5, "stock": 120},    {"name": "Monitor", "price": 189.9, "stock": 0},    {"name": "Webcam", "price": 45.0, "stock": 12},    {"name": "Desk", "price": 189.9, "stock": 3},]# A lambda is a small function with no name: arguments : expressionvat = lambda price: round(price * 1.21, 2)print("Laptop with VAT:", vat(899.0))# sorted(key=...) decides what to comparecheapest = sorted(products, key=lambda p: p["price"])print("By price:", [p["name"] for p in cheapest])# Tuples as keys: price high to low, then name A to Zranked = sorted(products, key=lambda p: (-p["price"], p["name"]))print("Ranked:", [p["name"] for p in ranked])# max and min also accept key=print("Most stock:", max(products, key=lambda p: p["stock"])["name"])# filter keeps the items for which the function returns Truein_stock = filter(lambda p: p["stock"] > 0, products)print("In stock:", [p["name"] for p in in_stock])# map applies a function to every itemnames = map(str.upper, (p["name"] for p in products))print("Labels:", list(names))print("With VAT:", list(map(vat, [15.5, 45.0])))

Salida · python3 main.py

Laptop with VAT: 1087.79
By price: ['Mouse', 'Webcam', 'Monitor', 'Desk', 'Laptop']
Ranked: ['Laptop', 'Desk', 'Monitor', 'Webcam', 'Mouse']
Most stock: Mouse
In stock: ['Laptop', 'Mouse', 'Webcam', 'Desk']
Labels: ['LAPTOP', 'MOUSE', 'MONITOR', 'WEBCAM', 'DESK']
With VAT: [18.75, 54.45]

Para recordar

  • lambda args: expresión crea una función de una línea.
  • sorted(datos, key=...) ordena por lo que devuelva la clave.
  • Una tupla como clave ordena por varios criterios.
  • filter y map son perezosos: páselos por list() para verlos.
  • Muchas veces una comprensión se lee mejor que map y filter.

Ejercicio

Escriba los nombres de los productos ordenados por el valor de su inventario (price * stock), de mayor a menor.