Descubriendo itertools

Johnnatan Sandoval Cardona - Sep 3 - - Dev Community

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)

Enter fullscreen mode Exit fullscreen mode
    2
    4
    6
    8
    10
Enter fullscreen mode Exit fullscreen mode

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

Enter fullscreen mode Exit fullscreen mode
    2
    4
    6
    8
    10
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode
    (1, 2)
    (3, 4)
    (5, 6)
    (7,)
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode
    1 2
    2 3
    3 4
    4 5
    5 6
    6 7
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode
   1 5
    1 6
    1 7
    2 5
    2 6
    2 7
    3 5
    3 6
    3 7
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode
    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
Enter fullscreen mode Exit fullscreen mode

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.

. . . . . . . .