Itertools
es una de las librerías más interesantes de python. Contiene una serie de funciones inspiradas en lenguajes funcionales que sirven para trabajar con iteradores.
En este artículo mencionaré alguna de las que más me han llamado la atención y que vale la pena tener presentes para no reinventar la rueda cada vez.
Count
Varias veces he implementado un conteo infinito (bueno, que termina
explícitamente en algún momento con un break
) usando un ciclo while True
. itertools
nos ofrece una mejor alternativa:
from itertools import count
for i in count(start=2, step=2):
if i > 10:
break
print(i)
2
4
6
8
10
Como puede verse en el ejemplo, de no ser por el break
, count
retornaría infinitos números. El código anterior es más o menos equivalente a:
i = 2
while True:
if i > 10:
break
print(i)
i += 2
2
4
6
8
10
batched
Una función para realizar algo muy común: obtener datos de una secuencia en lotes de tamaño n
. Veamos un ejemplo:
from itertools import batched
sequence = [1, 2, 3, 4, 5, 6, 7]
for batch in batched(sequence, 2): # lotes de tamaño 2
print(batch)
(1, 2)
(3, 4)
(5, 6)
(7,)
Es de notar que el último lote puede ser de un tamaño menor o igual a n
, como en este caso. Bastante útil, ¿no creen?
pairwise
Otra función sencilla y útil. Dada una secuencia (en realidad, dado un iterador), nos entrega sus elementos en pares.
Veámoslo mejor con un ejemplo:
from itertools import pairwise
sequence = [1, 2, 3, 4, 5, 6, 7]
for a, b in pairwise(sequence):
print(a, b)
1 2
2 3
3 4
4 5
5 6
6 7
La cantidad de parejas es una menos que el tamaño de la secuencia de entrada.
product
Finalmente, para esta corta entrada, quiero hablar de product
, una
implementación del producto cartesiano.
Útil para reemplazar un for
anidado que recorra dos secuencia de datos:
from itertools import product
A = [1, 2, 3]
B = [5, 6, 7]
for a, b in product(A, B):
print(a, b)
1 5
1 6
1 7
2 5
2 6
2 7
3 5
3 6
3 7
Recibe un parámetro que nos permite realizar el producto cartesiano de una
secuencia consigo misma:
from itertools import product
A = [1, 2, 3]
for a1, a2, a3 in product(A, repeat=3):
print(a1, a2, a3)
1 1 1
1 1 2
1 1 3
1 2 1
1 2 2
1 2 3
1 3 1
1 3 2
1 3 3
2 1 1
2 1 2
2 1 3
2 2 1
2 2 2
2 2 3
2 3 1
2 3 2
2 3 3
3 1 1
3 1 2
3 1 3
3 2 1
3 2 2
3 2 3
3 3 1
3 3 2
3 3 3
En una próxima entrada, mencionaré otras funciones más de este útil módulo de
librería estándar de python. Espero les sea de utilidad.