Saltar a contenido
 No os perd谩is mi futuro contenido, seguidme en y Youtube 馃榿

Funci贸n filter()

Tal como su nombre indica filter significa filtrar, y es una de mis funciones favoritas, ya que a partir de una lista o iterador y una funci贸n condicional, es capaz de devolver una nueva colecci贸n con los elementos filtrados que cumplan la condici贸n.

Por ejemplo, supongamos que tenemos una lista varios n煤meros y queremos filtrarla, qued谩ndonos 煤nicamente con los m煤ltiples de 5...

Note

def multiple(numero):    # Primero declaramos una funci贸n condicional
    if numero % 5 == 0:  # Comprobamos si un numero es m煤ltiple de cinco
        return True      # S贸lo devolvemos True si lo es

numeros = [2, 5, 10, 23, 50, 33]

filter(multiple, numeros)
<filter at 0x257ac84abe0>

Si ejecutamos el filtro obtenemos un objeto de tipo filtro, pero podemos transformarlo en una lista f谩cilmente haciendo un cast (conversi贸n):

Note

list( filter(multiple, numeros) )
[5, 10, 50]

Por tanto cuando utilizamos la funci贸n filter() tenemos que enviar una funci贸n condicional, pero como recordar茅is, no es necesario definirla, podemos utlizar una funci贸n an贸nima lambda:

Note

list( filter(lambda numero: numero%5 == 0, numeros) )
[5, 10, 50]

As铆, en una sola l铆nea hemos definido y ejecutado el filtro utilizando una funci贸n condicional an贸nima y una lista de numeros.

Filtrando objetos

Sin embargo, m谩s all谩 de filtrar listas con valores simples, el verdadero potencial de filter() sale a relucir cuando necesitamos filtrar varios objetos de una lista.

Por ejemplo, dada una lista con varias personas, nos gustar铆a filtrar 煤nicamente las que son menores de edad:

Note

class Persona:

    def __init__(self, nombre, edad):
        self.nombre = nombre
        self.edad = edad

    def __str__(self):
        return "{} de {} a帽os".format(self.nombre, self.edad)


personas = [
    Persona("Juan", 35),
    Persona("Marta", 16),
    Persona("Manuel", 78),
    Persona("Eduardo", 12)
]

Para hacerlo nos vamos a servir de una funci贸n lambda, comprobando el campo edad para cada persona:

Note

menores = filter(lambda persona: persona.edad < 18, personas)

for menor in menores:
    print(menor)
Marta de 16 a帽os
Eduardo de 12 a帽os

S茅 que es un ejemplo sencillo, pero estoy seguro que os puede servir como base para realizar filtrados en muchos de vuestros proyectos.


脷ltima edici贸n: 6 de Octubre de 2018