Guía de Itertools de Python

acumular()

itertools.accumulate(iterable)

Esta función hace un iterador que devuelve los resultados de una función. Las funciones se pueden pasar de forma muy parecida a las variables. La función accumulate() toma una función como argumento. También toma un iterable. Devuelve los resultados acumulados. Los resultados están a su vez contenidos en un iterable. Todo esto puede parecer muy confuso. Te aseguro que, cuando juegues con el código tendrá sentido.

Código

data = result = itertools.accumulate(data, operator.mul)
for each in result:
print(each)

Salida

1
2
6
24
120

El operador.mul toma dos números y los multiplica.

operator.mul(1, 2)
2
operator.mul(2, 3)
6
operator.mul(6, 4)
24
operator.mul(24, 5)
120

En el siguiente ejemplo utilizaremos la función max.

Código

data = result = itertools.accumulate(data, max)
for each in result:
print(each)

Salida

5
5
6
6
6
9
9

La función max devuelve el elemento más grande.

5
max(5, 2)
5
max(5, 6)
6
max(6, 4)
6
max(6, 5)
6
max(6, 9)
9
max(9, 1)
9

Pasar una función es opcional.

Código

data = result = itertools.accumulate(data)
for each in result:
print(each)

Salida

5
7
13
17
22
31
32

Si no se designa ninguna función se sumarán los elementos.

5
5 + 2 = 7
7 + 6 = 13
13 + 4 = 17
17 + 5 = 22
22 + 9 = 31
31 + 1 = 32

combinaciones()

itertools.combinations(iterable, r)

Esta función toma un iterable y un entero. Esto creará todas las combinaciones únicas que tengan r miembros.

Código

shapes = result = itertools.combinations(shapes, 2)for each in result:
print(each)

En este código hacemos todos los combos con 2 miembros.

Salida

('circle', 'triangle')
('circle', 'square')
('triangle', 'square')

Código

shapes = result = itertools.combinations(shapes, 3)for each in result:
print(each)

En este código hacemos todos los combos con 3miembros. Es un poco menos emocionante.

Salida

('circle', 'triangle', 'square')

combinaciones_con_reemplazo()

itertools.combinations_with_replacement(iterable, r)

Esta es igual que la función combinations(), pero esta permite repetir elementos individuales más de una vez.

Código

shapes = result = itertools.combinations_with_replacement(shapes, 2)
for each in result:
print(each)

Salida

('circle', 'circle')
('circle', 'triangle')
('circle', 'square')
('triangle', 'triangle')
('triangle', 'square')
('square', 'square')

contar()

itertools.count(start=0, step=1)

Hace un iterador que devuelve valores uniformes empezando por el número inicio.

Código

for i in itertools.count(10,3):
print(i)
if i > 20:
break

En el código anterior, iteramos o hacemos un bucle sobre una función. Le decimos a la función que empiece en 10 y que dé un paso 3.

Salida

10
13
16
19
22

Esta primera iteración tiene el valor 10. En el siguiente paso, escalamos o sumamos 3. Esto tiene el valor de 13. Hacemos lo mismo para la siguiente iteración y obtenemos un valor de 16. Esto continuaría para siempre pero, hemos añadido un break.

ciclo()

itertools.cycle(iterable)

Esta función recorre un iterador sin fin.

Código

colors = for color in itertools.cycle(colors):
print(color)

En el código anterior, creamos una lista. Luego hacemos un ciclo o bucle a través de esta lista sin fin. Normalmente, un bucle for recorre un iterable hasta llegar al final. Si una lista tiene 3 elementos, el bucle iterará 3 veces. Pero no si utilizamos la función cycle(). Con esta función, cuando lleguemos al final del iterable volvemos a empezar desde el principio.

Salida

red
orange
yellow
green
blue
indigo
violet
red
orange
yellow
green
...

He truncado la salida infinita anterior con elipses.

Cadena()

itertools.chain(*iterables)

Esta función toma una serie de iterables y los devuelve como un iterable largo.

Código

colors = 
shapes = result = itertools.chain(colors, shapes)
for each in result:
print(each)

Salida

red
orange
yellow
green
blue
circle
triangle
square
pentagon

comprimir()

itertools.compress(data, selectors)

Esta función filtra un iterable con otro.

Código

shapes = 
selections = result = itertools.compress(shapes, selections)
for each in result:
print(each)

Salida

circle
square

dropwhile()

itertools.dropwhile(predicate, iterable)

Hace un iterador que va soltando elementos del iterable mientras el predicado sea verdadero; después, devuelve cada elemento.

Código

data = result = itertools.dropwhile(lambda x: x<5, data)
for each in result:
print(each)

Salida

5
6
7
8
9
10
1

Vale. Esto es puede ser confuso. El código dice que deje caer cada ítem mientras el ítem sea menor a 5. Después de que encuentra un elemento que no es menor de 5, devuelve el resto. Por eso se devuelve ese último.

Paso a paso

1 < 5: True, drop
2 < 5: True, drop
3 < 5: True, drop
4 < 5: True, drop
5 < 5: False, return surviving items

filterfalse()

itertools.filterfalse(predicate, iterable)

Esta función hace un iterador que filtra los elementos del iterable devolviendo sólo aquellos para los que el predicado es False.

Código

data = 
result = itertools.filterfalse(lambda x: x<5, data)
for each in result:
print(each)

Salida

5
6
7
8
9
10

Paso a paso

1 < 5: True, drop
2 < 5: True, drop
3 < 5: True, drop
4 < 5: True, drop
5 < 5: False, keep
6 < 5: False, keep
7 < 5: False, keep
8 < 5: False, keep
9 < 5: False, keep
10 < 5: False, keep

groupby()

itertools.groupby(iterable, key=None)

En pocas palabras, esta función agrupa cosas. Ok. Esta es complicada. Y el ejemplo es un poco largo.

Código

robots = for key, group in itertools.groupby(bots, key=lambda x: x):
print(key)
print(list(group))

Salida

autobot

decepticon

islice()

itertools.islice(iterable, start, stop)

Esta función es muy parecida a las rodajas. Esta función permite cortar un trozo de un iterable.

Código

colors = 
few_colors = itertools.islice(colors, 2)
for each in few_colors:
print(each)

Salida

red
orange

permutaciones()

itertools.permutations(iterable, r=None)

Código

alpha_data = result = itertools.permutations(alpha_data)
for each in result:
print(each)

Salida

('a', 'b', 'c')
('a', 'c', 'b')
('b', 'a', 'c')
('b', 'c', 'a')
('c', 'a', 'b')
('c', 'b', 'a')

producto()

Esta función crea los productos cartesianos de una serie de iterables.

Código

num_data = 
alpha_data = result = itertools.product(num_data, alpha_data)
for each in result:
print(each)

Salida

(1, 'a')
(1, 'b')
(1, 'c')
(2, 'a')
(2, 'b')
(2, 'c')
(3, 'a')
(3, 'b')
(3, 'c')

Imagina una tabla así:

 a b c
1 a1 b1 c1
2 a2 b2 c3
3 a3 b3 b3

repeat()

itertools.repeat(object)

Esta función repetirá un objeto una y otra vez. A menos que haya un argumento times.

Código

for i in itertools.repeat("spam"):
print(i)

En el código anterior, creamos un iterable que simplemente repite spam una y otra vez. Lo hará de forma infinita. Así se hace el spam infinito.

Salida

spam
spam
spam
spam
spam
spam
...

He truncado la salida infinita anterior con elipses.

Código

for i in itertools.repeat("spam", 3):
print(i)

Si utilizamos el argumento times, podemos limitar el número de veces que se repetirá.

Salida

spam
spam
spam

En este ejemplo spam sólo se repite tres veces.

starmap()

itertools.starmap(function, iterable)

Esta función hace un iterador que calcula la función usando los argumentos obtenidos del iterable. Echemos un vistazo.

Código

data = 
result = itertools.starmap(operator.mul, data)
for each in result:
print(each)

Salida

12
32
21

Paso a paso

operator.mul(2, 6)
12
operator.mul(8, 4)
32
operator.mul(7, 3)
21

tomar mientras()

itertools.takwwhile(predicate, iterable)

Esto es un poco lo contrario de dropwhile(). Esta función hace un iterador y devuelve elementos del iterable siempre que el predicado sea verdadero.

Código

data = result = itertools.takewhile(lambda x: x<5, data)
for each in result:
print(each)

Salida

1
2
3
4

Paso a paso

1 < 5: True, keep going
2 < 5: True, keep going
3 < 5: True, keep going
4 < 5: True, keep going
5 < 5: False, stop and drop

tee()

itertools.tee(iterable, n=2)

Devuelve n iteradores independientes desde un único iterable.

Código

colors = 
alpha_colors, beta_colors = itertools.tee(colors)for each in alpha_colors:
print(each)print('..')for each in beta_colors:
print(each)

El valor por defecto es 2, pero se pueden hacer tantos como sean necesarios.

Salida

red
orange
yellow
green
blue
..
red
orange
yellow
green
blue

zip_longest()

itertools.zip_longest(*iterables, fillvalue=None)

Esta función hace un iterador que agrega elementos de cada uno de los iterables. Si las iterables tienen una longitud desigual, los valores que faltan se rellenan con fillvalue. La iteración continúa hasta que se agota el iterable más largo.

Código

colors = 
data = for each in itertools.zip_longest(colors, data, fillvalue=None):
print(each)

Salida

('red', 1)
('orange', 2)
('yellow', 3)
('green', 4)
('blue', 5)
(None, 6)
(None, 7)
(None, 8)
(None, 9)
(None, 10)

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *