4 Funciones de filtrado de Itertools en Python que probablemente no conocías

4 Funciones de filtrado de Itertools en Python desconocidas

 

En Python, los iteradores te ayudan a escribir código más Pythonico y a trabajar de manera más eficiente con secuencias largas. El módulo integrado itertools proporciona varias funciones útiles que crean iteradores.

Estas funciones son especialmente útiles cuando solo quieres recorrer el iterador, recuperar elementos de la secuencia y procesarlos, todo sin tener que almacenarlos en memoria. Hoy aprenderemos cómo utilizar las siguientes cuatro funciones de filtrado de itertools:

  • filterfalse
  • takewhile
  • dropwhile
  • islice

¡Comencemos!

 

Antes de comenzar: una nota sobre los ejemplos de código

 

En este tutorial:

  • Todas las cuatro funciones que discutiremos devuelven iteradores. Para mayor claridad, trabajaremos con secuencias simples y usaremos list() para obtener una lista que contenga todos los elementos devueltos por el iterador. Pero evita hacerlo, a menos que sea necesario, cuando trabajes con secuencias largas. Porque al hacerlo, perderás el ahorro de memoria que te proporcionan los iteradores.
  • Para funciones de predicado simples, también puedes usar funciones lambda. Pero para una mejor legibilidad, definiremos funciones regulares y las utilizaremos como predicados.

 

1. filterfalse

 

Si has estado programando en Python durante un tiempo, es probable que hayas utilizado la función integrada filter con la siguiente sintaxis:

filter(pred, seq)
# pred: función de predicado
# seq: cualquier iterable válido en Python

 

La función filter devuelve un iterador que devuelve elementos de la secuencia para los cuales el predicado devuelve True.

Veamos un ejemplo:

nums = list(range(1,11)) #[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

def is_even(n):
    return n % 2 == 0

 

Aquí, la lista nums y la función is_even son la secuencia y el predicado, respectivamente.

Para obtener la lista de todos los números pares en nums, utilizamos filter de la siguiente manera:

nums_even = filter(is_even, nums)
print(list(nums_even))

 

Output >>> [2, 4, 6, 8, 10]

 

Ahora aprendamos sobre filterfalse. Importaremos la función filterfalse (y todas las demás funciones que discutiremos) del módulo itertools.

Como su nombre sugiere, filterfalse hace lo contrario de lo que hace la función filter. Devuelve un iterador que devuelve elementos para los cuales el predicado devuelve False. Aquí está la sintaxis para usar la función filterfalse:

from itertools import filterfalse
filterfalse(pred, seq)

 

La función is_even devuelve False para todos los números impares en nums. Por lo tanto, la lista nums_odd obtenida usando filterfalse es la lista de todos los números impares en nums:

from itertools import filterfalse

nums_odd = filterfalse(is_even, nums)
print(list(nums_odd)) 

 

Output >>> [1, 3, 5, 7, 9]

 

2. takewhile

 

La sintaxis para usar la función takewhile es:

from itertools import takewhile
takewhile(pred,seq)

 

La función takewhile devuelve un iterador que retorna elementos siempre y cuando la función predicado devuelva True. Deja de retornar elementos cuando el predicado devuelve False por primera vez. 

Para una secuencia de longitud n, si seq[k] es el primer elemento para el cual la función predicado devuelve False, entonces el iterador retorna seq[0], seq[1],…, seq[k-1].

Considera la siguiente lista nums y la función predicado is_less_than_5. Usamos la función takewhile de la siguiente manera:

from itertools import takewhile

def is_less_than_5(n):
    return n < 5

nums = [1, 3, 5, 2, 4, 6]
filtered_nums_1 = takewhile(is_less_than_5, nums)
print(list(filtered_nums_1))  

 

Aquí, el predicado is_less_than_5 devuelve False—por primera vez—para el número 5:

Salida >>> [1, 3]

 

3. dropwhile

 

Funcionalmente, la función dropwhile hace lo opuesto a lo que hace la función takewhile

Así es como puedes usar la función dropwhile:

from itertools import dropwhile
dropwhile(pred,seq) 

 

La función dropwhile devuelve un iterador que va dejando caer elementos—siempre y cuando el predicado sea True. Esto significa que el iterador no devuelve nada hasta que el predicado devuelve False por primera vez. Y una vez que el predicado devuelve False, el iterador devuelve todos los elementos subsiguientes en la secuencia. 

Para una secuencia de longitud n, si seq[k] es el primer elemento para el cual la función predicado devuelve False, entonces el iterador retorna seq[k], seq[k+1],…, seq[n-1].

Utilicemos la misma secuencia y predicado:

from itertools import dropwhile

def is_less_than_5(n):
    return n < 5

nums = [1, 3, 5, 2, 4, 6]
filtered_nums_2 = dropwhile(is_less_than_5, nums)
print(list(filtered_nums_2)) 

 

Porque la función predicado is_less_than_5 devuelve False—por primera vez—para el elemento 5, obtenemos todos los elementos de la secuencia a partir de 5:

Salida >>> [5, 2, 4, 6]

 

4. islice

 

Ya estarás familiarizado con el corte de iterables de Python como listas, tuplas y cadenas. El corte tiene la sintaxis: iterable[inicio:fin:paso].

Sin embargo, este enfoque de corte tiene las siguientes desventajas:

  • Cuando se trabaja con secuencias grandes, cada corte o subsecuencia es una copia que ocupa memoria. Esto puede ser ineficiente.
  • Porque el paso también puede tomar valores negativos, el uso de los valores de inicio, fin y paso afecta la legibilidad.

La función islice aborda las limitaciones anteriores:

  • Devuelve un iterador.
  • No permite valores negativos para el paso.

Puedes usar la función islice de la siguiente manera:

from itertools import islice
islice(seq,inicio,fin,paso) 

 

Aquí hay algunas formas diferentes en las que puedes usar la función islice:

  • Usar islice(seq, stop) devuelve un iterador sobre la sección seq[0], seq[1],…, seq[stop - 1].
  • Si especificas los valores de inicio y parada: islice(seq, start, stop), la función devuelve un iterador sobre la sección seq[start], seq[start + 1],…, seq[start + stop - 1].
  • Cuando especificas los argumentos de inicio, parada y paso, la función devuelve un iterador sobre la sección seq[start], seq[start + step], seq[start + 2*step],…, seq[start + k*step]. Tal que start + k*step < stop y start + (k+1)*step >= stop.

Tomemos un ejemplo de lista para entender esto mejor:

nums = list(range(10)) #[0,1, 2, 3, 4, 5, 6, 7, 8, 9]

 

Ahora usemos la función islice con la sintaxis que hemos aprendido.

 

Usando solo el valor de parada

 

Especifiquemos solo el índice de parada:

from itertools import islice

# solo parada
sliced_nums = islice(nums, 5)
print(list(sliced_nums)) 

 

Y aquí está la salida:

Salida >>> [0, 1, 2, 3, 4]

 

Usando los valores de inicio y parada

 

Aquí, usamos tanto los valores de inicio como los de parada:

# inicio y parada
sliced_nums = islice(nums, 2, 7)
print(list(sliced_nums))

 

La sección comienza en el índice 2 y se extiende hasta pero no incluye el índice 7:

Salida >>> [2, 3, 4, 5, 6]

 

Usando los valores de inicio, parada y paso

 

Cuando usamos los valores de inicio, parada y paso:

# usando inicio, parada y paso
sliced_nums = islice(nums, 2, 8, 2)
print(list(sliced_nums))  

 

Obtenemos una sección que comienza en el índice 2, se extiende hasta pero no incluye el índice 8, con un tamaño de paso de 2 (devolviendo cada segundo elemento).

Salida >>> [2, 4, 6]

 

Conclusión

 

Espero que este tutorial te haya ayudado a entender los conceptos básicos de las funciones de filtrado de itertools. Has visto algunos ejemplos simples para comprender mejor el funcionamiento de estas funciones. A continuación, puedes aprender cómo funcionan los generadores, las funciones generadoras y las expresiones generadoras como iteradores eficientes en Python.     Bala Priya C es una desarrolladora y escritora técnica de India. Le gusta trabajar en la intersección de las matemáticas, la programación, la ciencia de datos y la creación de contenido. Sus áreas de interés y experiencia incluyen DevOps, ciencia de datos y procesamiento del lenguaje natural. Le gusta leer, escribir, codificar y tomar café. Actualmente, está trabajando en aprender y compartir su conocimiento con la comunidad de desarrolladores mediante la creación de tutoriales, guías prácticas, opiniones y más.  

We will continue to update Zepes; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

Inteligencia Artificial

Un novedoso modelo de aprendizaje automático acelera la evaluación de catalizadores de descarbonización de meses a milisegundos

La biomasa se refiere a la materia orgánica, como plantas, madera, residuos agrícolas y otros materiales biológicos, ...

Aprendizaje Automático

Detectando el Crecimiento del Cáncer Utilizando Inteligencia Artificial y Visión por Computadora.

El cáncer de mama es una de las formas más mortales de cáncer en mujeres. Según la Organización Mundial de la Salud (...

Inteligencia Artificial

Bienvenido a una nueva era de construcción en la nube con IA generativa en AWS

Creemos que la IA generativa tiene el potencial, con el tiempo, de transformar virtualmente todas las experiencias de...

Inteligencia Artificial

Conoce DISCO Una novedosa técnica de IA para la generación de bailes humanos

La inteligencia artificial generativa ha despertado un gran interés en la comunidad de la visión por computadora. Los...

Inteligencia Artificial

Jugando ¿Dónde está Wally? en 3D OpenMask3D es un modelo de IA que puede segmentar instancias en 3D con consultas de vocabulario abierto.

La segmentación de imágenes ha avanzado mucho en la última década, gracias al avance de las redes neuronales. Ahora e...

Investigación

Investigadores de la Universidad de Surrey lanzan una herramienta revolucionaria de detección de objetos basada en bocetos en el aprendizaje automático.

Desde tiempos prehistóricos, las personas han utilizado bocetos para comunicación y documentación. Durante la última ...