Filtrado de listas con filter en Python

Clase 23 de 25Curso de Python Intermedio para Entornos virtuales y PEP8

Contenido del curso

Creación de Aplicaciones de Consola

Resumen

Domina cómo usar filter en Python para limpiar datos de forma clara y eficiente. Verás primero un filtrado clásico con for y operador módulo, luego la versión con filter que retorna un iterador, y finalmente la integración en un sistema de noticias para obtener artículos por fuente con una lambda y comparación sin importar mayúsculas.

¿Cómo filtrar números pares con un for y operador módulo?

Empezamos con una lista del 1 al 10 y un filtrado manual. La clave es el operador módulo: si num % 2 == 0, el número es par. Así construimos una nueva lista con los pares.

# filter_pairs.py numbers = list(range(1, 11)) pairs = [] for num in numbers: if num % 2 == 0: # operador módulo con 2 pairs.append(num) print(numbers) print(pairs)
  • Uso de operador módulo para evaluar pares.
  • Construcción de una lista a partir de otra.
  • Impresión de lista original y lista filtrada.

¿Qué hace filter en Python y por qué retorna un iterador?

La función filter recibe dos argumentos: una función que retorna booleano y un iterable (por ejemplo, list, set o las llaves de un diccionario). Al aplicarla, devuelve un iterador que se evalúa bajo demanda, útil con muchos datos porque solo “se calcula” al consumirlo.

def is_pair(n: int) -> bool: return n % 2 == 0 pairs_iter = filter(is_pair, numbers) # retorna un iterador for pair in pairs_iter: print(pair)

Si se necesita la colección completa, conviene convertir el iterador a list.

pairs_list = list(filter(is_pair, numbers)) print(pairs_list)
  • filter requiere función que retorne True/False y un iterable.
  • Retorna un iterador, no una lista directa.
  • Conversión con list(...) cuando se desea materializar resultados.
  • Evaluación perezosa: solo se procesa cuando se consume, ideal si luego usarás pocos elementos.

¿Cómo integrar filter para seleccionar artículos por fuente en un sistema de noticias?

Se implementa una utilidad getarticles_by_source que recibe una lista de diccionarios y un str con la fuente. Se usa filter con lambda para comparar el nombre de la fuente en cada artículo y se convierte el resultado a lista para mantener el typing esperado.

from typing import List, Dict def getarticles_by_source(articles: List[Dict], source: str) -> List[Dict]: filtered = filter( lambda article: article["source"]["name"].lower() == source.lower(), articles ) return list(filtered)
  • Uso de lambda como función anónima para el criterio de filtrado.
  • Acceso a campos anidados: article['source']['name'].
  • Comparación case-insensitive con .lower() en ambos lados para evitar discrepancias de mayúsculas/minúsculas.
  • Conversión a list para cumplir con el tipo de retorno y evitar errores de typing.

¿Cómo depurar la fuente correcta disponible?

Si el resultado es una lista vacía, imprime las fuentes únicas para verificar nombres exactos (por ejemplo, diferencias entre “GitHub” y “github.com”). Un “set comprimido” ayuda a inspeccionar rápidamente.

sources = {article["source"]["name"] for article in articles} print(sources)
  • Inspección rápida con comprensión de conjuntos.
  • Verificación de valores reales presentes en source.name.
  • Ajuste del criterio: coincidencia exacta o normalizada con .lower().

¿Cómo presentar los resultados sin for condicionales adicionales?

Tras filtrar, se pueden imprimir campos específicos como el título.

github_articles = getarticles_by_source(articles, "github.com") for a in github_articles: print(a["title"]) # mostrar solo el título
  • Mantén el filtrado en una sola expresión con filter.
  • Evita bucles condicionales redundantes que consumen CPU o memoria.
  • Muestra la información clave que necesitas, como el title.

¿Tienes otra fuente que te gustaría filtrar o un criterio más complejo con lambda? Comparte tu caso y lo resolvemos juntos.