Curso
Filtrar es una de las tareas más comunes en Python, por eso Python te lo pone fácil. Una de las formas más sencillas de filtrar datos es con la función incorporada filter()
. Como su nombre deja claro, filter()
te permite sacar sólo los elementos que cumplen una determinada condición (o condiciones).
Esta guía te explica cómo funciona, cuándo utilizarla y cómo se compara con otras herramientas de filtrado. ¡Léelo!
Qué hace filter() de Python
filter()
te permite extraer elementos de una lista, tupla o cualquier iterable, pero sólo si superan tu prueba. Proporcionas una función (a veces he visto que se llama predicado) que toma cada elemento y devuelve True
o False
. Si la prueba pasa (léase: si tu función devuelve True
) filter()
se la queda. De lo contrario, omite el elemento. Esto se explica por sí mismo, así que continuemos.
Sintaxis de Python filter()
Éste es el formato:
filter(function, iterable)
-
function
: Especifica la prueba que quieres aplicar a cada elemento. Debe tomar un argumento y devolverTrue
oFalse
. -
iterable
: Proporciona una lista, tupla, cadena o cualquier objeto sobre el que puedas hacer un bucle.
Cuando llamas a filter()
, devuelve un objeto filtro especial, no una lista o tupla directamente. Para trabajar realmente con los resultados filtrados, normalmente envolverás la salida en una lista o tupla. Esta elección de diseño mantiene la eficiencia de filter()
, pero es algo que debes tener en cuenta cuando escribas tu código.
Ejemplos de Python filter()
Practiquemos un poco.
Python filter() con una función personalizada
Utilicemos filter()
con una función que escribamos nosotros mismos.
Supón que quieres conservar sólo los números pares de una lista:
def is_even(num):
return num % 2 == 0
numbers = [1, 2, 3, 4, 5, 6]
result = filter(is_even, numbers)
print(list(result))
Se imprimirá:
[2, 4, 6]
Observa cómo is_even
comprueba si un número es divisible por 2. filter()
utiliza nuestra función personalizada para comprobar cada elemento y quedarse con los que superan nuestra prueba.
Python filter() con funciones lambda
Por supuesto, no todos los filtros necesitan una definición de función completa. A veces, tu regla de filtrado es tan sencilla o tan específica de un punto que definir una función con nombre es demasiado trabajo.
Aquí tienes el mismo ejemplo de número par, pero utilizando una lambda para una prueba concisa e in situ:
numbers = [1, 2, 3, 4, 5, 6]
result = filter(lambda x: x % 2 == 0, numbers)
print(list(result))
Obtendrás el mismo resultado que antes.
Utilizar lambda con filter()
es especialmente habitual cuando quieres mantener tu código corto y centrado. Es ideal para tareas de filtrado puntuales, ya que te permite expresar tu regla justo donde la necesitas.
Python filter() con None como función
A veces, quieres filter()
valores vacíos o falsos. Cosas como 0
, cadenas vacías, None
, o False
, y queremos hacerlo sin escribir una función personalizada.
Python tiene un truco para esto: Si estableces el argumento de la función en filter()
como None
, filter()
eliminará automáticamente todos los elementos que Python considere False
.
He aquí un ejemplo:
items = [0, 1, '', 'hello', [], [2, 3], None, False, True]
result = filter(None, items)
print(list(result))
Se imprimirá:
[1, 'hello', [2, 3], True]
Filtrar datos de texto
Apliquemos ahora filter()
a un problema práctico y cotidiano. Supón que tienes una lista de palabras y sólo quieres las que empiezan por "a". Este tipo de filtrado selectivo se da siempre que se procesa texto.
words = ['apple', 'banana', 'apricot', 'cherry', 'avocado']
result = filter(lambda word: word.startswith('a'), words)
print(list(result))
Conseguirás:
['apple', 'apricot', 'avocado']
Filtrar con múltiples condiciones
A veces, tus criterios de filtrado son más complejos. ¿Y si necesitas artículos que cumplan varias condiciones? He aquí cómo puedes hacerlo utilizando una lambda. En este ejemplo, buscamos números pares y mayores que 10.
numbers = [4, 10, 12, 15, 20, 23, 28]
result = filter(lambda x: x % 2 == 0 and x > 10, numbers)
print(list(result))
Esto imprime:
[12, 20, 28]
(Si tuviera aún más condiciones, me plantearía cambiar de una lambda a una función con nombre para mayor claridad).
filtro() vs. Comprensión de listas
Las comprensiones de listas son otra forma popular de seleccionar elementos. Ambos enfoques te permiten filtrar datos, pero cada uno tiene su propio estilo.
Aquí tienes de nuevo el ejemplo del número par, esta vez utilizando una comprensión de lista:
numbers = [1, 2, 3, 4, 5, 6]
result = [x for x in numbers if x % 2 == 0]
print(result)
[2, 4, 6]
Tanto filter()
como las comprensiones de listas harán el trabajo. Las comprensiones de listas suelen ser más fáciles de leer para los filtros directos, sobre todo cuando la regla es corta y sencilla.
Por otra parte, filter()
funciona bien cuando ya estás trabajando con funciones, o cuando quieres encadenar varios pasos de procesamiento.
Usos más avanzados
Intentemos encontrar algunos casos más interesantes:
filter() con otros iterables
Al igual que hicimos con las listas, filter()
también funciona con cualquier iterable, como tuplas, conjuntos... incluso expresiones generadoras. Es bueno saberlo porque tus datos no siempre estarán en forma de lista.
He aquí cómo puedes filtrar una tupla:
numbers = (10, 15, 20, 25, 30)
result = filter(lambda x: x > 20, numbers)
print(tuple(result))
Se imprimirá:
(25, 30)
Sólo recuerda convertir el objeto filtro al tipo que desees (lista, tupla, etc.) cuando necesites utilizar los resultados directamente.
Ahora, también he mencionado los generadores, así que, para ser exhaustivo, también mostraré un ejemplo de filtrado con generadores:
numbers = (x for x in range(10))
result = filter(lambda x: x % 2 == 0, numbers)
print(list(result))
Se trata de un generador porque esta línea: numbers = (x for x in range(10))
crea un objeto generador. (Es perezoso y no genera todos los valores a la vez).
La línea final: print(list(result))
fuerza la evaluación convirtiendo el objeto filtro perezoso en una lista.
Combinar filter() con map()
¿Y si quieres tanto filtrar como transformar tus datos, como, para nuestro siguiente ejemplo, elevar al cuadrado sólo los números pares de una lista?
Python te lo pone fácil permitiéndote combinar filter()
y map()
. Primero, filter()
elige los elementos que quieres, y luego map()
aplica otra función a cada uno de ellos.
Esto es lo que ocurre en la práctica:
numbers = [1, 2, 3, 4, 5, 6]
evens = filter(lambda x: x % 2 == 0, numbers)
squared = map(lambda x: x ** 2, evens)
print(list(squared))
Esto imprime:
[4, 16, 36]
Encadenando filter()
y map()
, puedes construir conductos de datos claros y legibles, seleccionando primero los elementos que te interesan y transformándolos después según sea necesario. Habrá oportunidades de utilizar este patrón en tu propio trabajo.
Cosas a tener en cuenta
Por muy útil que sea filter()
, la gente comete algunos errores:
-
filter()
devuelve un objeto filtro, no una lista. Esto puede hacerte tropezar si esperas ver resultados enseguida. Envuélvelo siempre en una lista (o tupla) si necesitas ver o reutilizar los resultados. -
filter()
sólo funciona con un iterable cada vez. Si quieres filtrar basándote en varias listas, tendrás que comprimirlas o utilizar otro método. -
filter()
es perezoso. En realidad, no procesa los datos hasta que los conviertes en una lista, tupla o bucle sobre ellos. Ten en cuenta este comportamiento cuando depures.
Conclusión
Como has visto, la función filter()
de Python te ofrece una forma rápida de limpiar los datos sacando sólo lo que importa. filter()
te ayuda si estás escribiendo una lambda única o introduciendo una función con nombre.
Si no tienes claro cómo utilizar filter()
, o si crees que ha sido lo suficientemente sencillo y quieres seguir aprendiendo, tenemos excelentes recursos para ayudarte. Te recomiendo nuestro programa Fundamentos de programación en Python.

Preguntas frecuentes sobre el filtro Python
¿Qué hace la función filter() de Python?
La función filter()
toma una función y un iterable y devuelve un nuevo iterable con sólo los elementos que superan una prueba. La función de prueba debe devolver True
para los elementos que quieras conservar y False
para los que quieras omitir.
¿Por qué tengo que envolver el resultado de filter() en list() o tuple()?
filter()
devuelve un objeto filtro, que es un iterador. Para ver o reutilizar los resultados filtrados, normalmente los convertirás en una lista o tupla utilizando list()
o tuple()
. Este paso es esencial para imprimir, depurar o pasar el resultado a otras funciones.
¿Puedo utilizar filter() sin escribir una función personalizada?
Sí. Puedes utilizar una función lambda para pruebas cortas y puntuales, o pasar None
como argumento de la función para eliminar automáticamente todos los valores "falsos" como 0
, ''
, None
y False
.
¿Cómo se compara filter() con las comprensiones de listas?
Tanto filter()
como las comprensiones de listas te permiten filtrar datos, pero las comprensiones de listas suelen ser más legibles para condiciones sencillas. filter()
es útil cuando se reutiliza la lógica mediante funciones o se encadena con herramientas como map()
.
¿Puedo aplicar varias condiciones con filter()?
Absolutamente. Puedes combinar varias condiciones utilizando operadores lógicos dentro de tu función de prueba o lambda. Para la lógica compleja, a menudo es mejor utilizar una función con nombre para mantener el código legible.