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)