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!
- Investigadores de NYU desarrollaron una nueva técnica de inteligencia artificial para cambiar la edad aparente de una persona en imágenes mientras se mantienen sus características únicas de identificación.
- ChatGPT Enterprise de OpenAI se enfoca en seguridad, escalabilidad y personalización
- Búsqueda de Google en India ahora está impulsada por IA | Aprende cómo usarlo
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ónseq[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ónseq[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 questart + k*step
<stop
ystart + (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!
Was this article helpful?
93 out of 132 found this helpful
Related articles
- Investigadores de la NTU de Singapur proponen IT3D un nuevo método de refinamiento de IA Plug-and-Play para la generación de texto a 3D.
- Chat con Documentos de la Empresa’ utilizando Azure OpenAI
- Mejores cursos gratuitos de IA para asegurar tu futuro profesional
- Introducción a la Estructura de Datos Montículo
- Investigadores de Google presentan 𝗦𝘆𝗻𝘁𝗵𝗜𝗗 una herramienta digital para marcar con marcas de agua e identificar imágenes generadas por IA
- Métodos de Regresión y Bayesianos en la Elicitación Moderna de Preferencias
- ¿Cómo limita el principio de incertidumbre el análisis de series temporales?