Itertools
El módulo itertools
en Python es una biblioteca estándar que proporciona un conjunto de herramientas para crear y manipular iteradores de manera eficiente. Las funciones de itertools
son muy útiles para realizar operaciones sobre listas, tuplas, y otros iterables. Aquí te explicaré las funciones principales del módulo itertools
junto con ejemplos detallados.
1. Iteradores Infinito
count(start=0, step=1)
Genera una secuencia infinita de números, comenzando desde start
y aumentando por step
.
import itertools
counter = itertools.count(start=10, step=2)
print(next(counter)) # 10
print(next(counter)) # 12
print(next(counter)) # 14
cycle(iterable)
Cicla infinitamente a través de un iterable.
cycler = itertools.cycle('AB')
print(next(cycler)) # A
print(next(cycler)) # B
print(next(cycler)) # A
repeat(object, times=None)
Repite un objeto indefinidamente o un número específico de veces.
repeater = itertools.repeat(10, 3)
print(list(repeater)) # [10, 10, 10]
2. Iteradores de Terminación
accumulate(iterable, func=operator.add, *, initial=None)
Devuelve acumulados de sumar los elementos.
import operator
data = [1, 2, 3, 4]
print(list(itertools.accumulate(data))) # [1, 3, 6, 10]
print(list(itertools.accumulate(data, operator.mul))) # [1, 2, 6, 24]
chain(*iterables)
Une varios iterables en uno solo.
print(list(itertools.chain('ABC', 'DEF'))) # ['A', 'B', 'C', 'D', 'E', 'F']
chain.from_iterable(iterable)
Versión alternativa de chain
para iterables anidados.
data = [['A', 'B', 'C'], ['D', 'E', 'F']]
print(list(itertools.chain.from_iterable(data))) # ['A', 'B', 'C', 'D', 'E', 'F']
compress(data, selectors)
Filtra elementos en data
, eligiendo aquellos cuyos valores correspondientes en selectors
son verdaderos.
data = 'ABCDEF'
selectors = [1, 0, 1, 0, 1, 0]
print(list(itertools.compress(data, selectors))) # ['A', 'C', 'E']
dropwhile(predicate, iterable)
Descarta elementos desde el principio mientras el predicate
es verdadero; después devuelve todos los elementos restantes.
data = [1, 2, 3, 4, 5]
print(list(itertools.dropwhile(lambda x: x < 3, data))) # [3, 4, 5]
filterfalse(predicate, iterable)
Filtra elementos donde el predicate
es falso.
data = [1, 2, 3, 4, 5]
print(list(itertools.filterfalse(lambda x: x % 2, data))) # [2, 4]
groupby(iterable, key=None)
Agrupa elementos consecutivos que tienen la misma clave.
data = 'AAAABBBCCDAABBB'
grouped = itertools.groupby(data)
for key, group in grouped:
print(key, list(group))
# A ['A', 'A', 'A', 'A']
# B ['B', 'B', 'B']
# C ['C', 'C']
# D ['D']
# A ['A', 'A']
# B ['B', 'B', 'B']
islice(iterable, start, stop, step=1)
Realiza un “slice” (rebanado) de un iterable.
data = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(list(itertools.islice(data, 2, 8, 2))) # [2, 4, 6]
starmap(function, iterable)
Aplica una función usando los elementos de los iterables como argumentos.
data = [(2, 5), (3, 2), (10, 3)]
print(list(itertools.starmap(pow, data))) # [32, 9, 1000]
takewhile(predicate, iterable)
Devuelve elementos desde el iterable mientras el predicate
es verdadero.
data = [2, 4, 6, 7, 8, 10]
print(list(itertools.takewhile(lambda x: x % 2 == 0, data))) # [2, 4, 6]
tee(iterable, n=2)
Divide un iterable en n
iterables independientes.
data = [0, 1, 2, 3, 4]
a, b = itertools.tee(data, 2)
print(list(a)) # [0, 1, 2, 3, 4]
print(list(b)) # [0, 1, 2, 3, 4]
zip_longest(*iterables, fillvalue=None)
Combina elementos de varios iterables en tuplas, completando con fillvalue
cuando los iterables tienen diferente longitud.
x = [1, 2, 3]
y = ['a', 'b']
print(list(itertools.zip_longest(x, y, fillvalue='-'))) # [(1, 'a'), (2, 'b'), (3, '-')]
3. Iteradores de Combinación
product(*iterables, repeat=1)
Devuelve el producto cartesiano de los iterables.
print(list(itertools.product('AB', range(2)))) # [('A', 0), ('A', 1), ('B', 0), ('B', 1)]
print(list(itertools.product([1, 2], repeat=2))) # [(1, 1), (1, 2), (2, 1), (2, 2)]
permutations(iterable, r=None)
Devuelve todas las posibles permutaciones de un iterable de longitud r
.
print(list(itertools.permutations('ABC', 2))) # [('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('C', 'A'), ('C', 'B')]
combinations(iterable, r)
Devuelve todas las combinaciones posibles de longitud r
sin repetición de un iterable.
print(list(itertools.combinations('ABC', 2))) # [('A', 'B'), ('A', 'C'), ('B', 'C')]
combinations_with_replacement(iterable, r)
Devuelve todas las combinaciones posibles de longitud r
con repetición de un iterable.
print(list(itertools.combinations_with_replacement('ABC', 2))) # [('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'B'), ('B', 'C'), ('C', 'C')]