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

Pronóstico de Eventos Futuros Las Capacidades y Limitaciones de la IA y el Aprendizaje Automático

¿Alguna vez te has preguntado cómo los adivinos, astrólogos o nuestra conocida Baba Vanga solían predecir eventos fut...

Ciencia de Datos

JPL Crea Archivo PDF para Ayudar en la Investigación de Malware.

Los científicos de datos han recopilado 8 millones de archivos PDF en un archivo de código abierto para mejorar la se...

Ciencia de Datos

PatchTST Un avance en la predicción de series temporales.

Los modelos basados en Transformer han sido aplicados con éxito en muchos campos, como el procesamiento del lenguaje ...

Inteligencia Artificial

Investigadores de CMU proponen TIDEE Un agente incorporado que puede ordenar habitaciones nunca antes vistas sin ninguna instrucción explícita

La operación efectiva de un robot requiere más que simplemente obedecer ciegamente comandos predefinidos. Los robots ...

Inteligencia Artificial

FedML y Theta presentan un superclúster de IA descentralizada impulsando la IA generativa y la recomendación de contenido

En una colaboración innovadora, FedML y Theta Network se han unido para lanzar un supercluster de IA descentralizado ...

Inteligencia Artificial

China redacta reglas para la tecnología de reconocimiento facial

La Administración del Ciberespacio de China ha emitido normas provisionales que regulan el uso de la tecnología de re...