SolveConPython

Python Reto #5 — Filtrar números pares de una lista

Nivel: Principiante
Tema: Listas, condicionales, bucles, comprensión de listas, validación de entradas, tests con pytest
Objetivo: Crear una función que devuelva únicamente los números pares de una lista, manteniendo el orden original y manejando entradas inválidas de forma segura.

Reto #5 Filtrar números pares
Reto #5 Filtrar números pares

Enunciado

Crea una función llamada filtrar_pares(lista) que:

  1. Reciba un valor lista.
  2. Si lista es None, devuelva una lista vacía [].
  3. Si lista no es una lista (list), lance TypeError.
  4. Devuelva una nueva lista que contenga solo los números pares.
  5. Mantenga el orden original de los elementos.
  6. Ignore valores que no sean enteros (int).

Ejemplos

  • filtrar_pares([1, 2, 3, 4, 5, 6])[2, 4, 6]
  • filtrar_pares([10, 15, 20, 25])[10, 20]
  • filtrar_pares([1, "2", 4, None])[4]
  • filtrar_pares([])[]
  • filtrar_pares(None)[]
  • filtrar_pares("123")TypeError

Pistas

  1. Un número es par si numero % 2 == 0.
  2. Antes de aplicar el módulo, asegúrate de que el valor sea un int.
  3. Puedes resolverlo con un bucle for o con una comprensión de listas.

Solución explicada (paso a paso)

  1. Si la lista es None, no hay nada que filtrar → devolvemos [].
  2. Si la entrada no es una lista, lanzamos TypeError.
  3. Creamos una lista vacía para los resultados.
  4. Recorremos cada elemento:
    • si es un entero (int) y es par, lo añadimos a la lista resultado,
    • si no, lo ignoramos.
  5. Devolvemos la lista filtrada manteniendo el orden original.

Python
def filtrar_pares(lista: list | None) -> list:
"""
Filtra los números pares de una lista.
Reglas:
- None -> []
- No list -> TypeError
- Devuelve solo enteros pares
- Mantiene el orden original
"""
if lista is None:
return []
if not isinstance(lista, list):
raise TypeError("El parámetro 'lista' debe ser una lista o None.")
pares = []
for valor in lista:
if isinstance(valor, int) and valor % 2 == 0:
pares.append(valor)
return pares

Python
import pytest
from reto_05_filtrar_pares import filtrar_pares
def test_lista_normal():
assert filtrar_pares([1, 2, 3, 4, 5, 6]) == [2, 4, 6]
def test_mezcla_tipos():
assert filtrar_pares([1, "2", 4, None, 7, 8]) == [4, 8]
def test_lista_vacia():
assert filtrar_pares([]) == []
def test_none_devuelve_lista_vacia():
assert filtrar_pares(None) == []
def test_tipo_incorrecto_lanza_typeerror():
with pytest.raises(TypeError):
filtrar_pares("123")
  • pytest -q

Variantes para subir de nivel (opcional)

  1. Usar comprensión de listas: versión más concisa
  2. Soportar tuple: aceptar listas y tuplas
  3. Parámetro opcional: filtrar pares o impares según un flag
  4. Validar negativos y cero: confirmar comportamiento esperado

Lo que aprendiste

  • Cómo filtrar listas con condiciones
  • Cómo validar tipos antes de operar
  • Cómo mantener el orden original
  • Cómo escribir funciones predecibles y testeables

Accede al código completo y a los tests en GitHub para ejecutar y modificar la solución localmente.

Cuando termines este reto, estás listo para pasar a Intermedio o continuar con Reto #6 — Palíndromo (ignorando espacios y mayúsculas) para profundizar en strings y normalización.