Módulo Python Itertools
O módulo itertools é uma coleção de ferramentas destinadas a serem rápidas e a usar a memória de forma eficiente ao lidar com iteradores (como listas ou dicionários).
O módulo padroniza um conjunto central de ferramentas rápidas e eficientes em termos de memória que são úteis por si só ou em combinação. Juntas, elas formam uma “álgebra de iteradores”, tornando possível construir ferramentas especializadas de forma sucinta e eficiente em Python puro.
O módulo itertools faz parte da biblioteca padrão e deve ser importado. Alguns exemplos também usam o módulo operator.
import itertools
import operator
accumulate()
Cria um iterador que retorna os resultados de uma função.
itertools.accumulate(iterable[, func])
Exemplo:
data = [1, 2, 3, 4, 5]
# Acumular com a função de multiplicação
result = itertools.accumulate(data, operator.mul)
for each in result:
print(each)
1
2
6
24
120
O operator.mul recebe dois números e os multiplica:
operator.mul(1, 2)
# 2
operator.mul(2, 3)
# 6
operator.mul(6, 4)
# 24
operator.mul(24, 5)
# 120
Passar uma função é opcional:
data = [5, 2, 6, 4, 5, 9, 1]
# Acumular sem função, o padrão é a adição
result = itertools.accumulate(data)
for each in result:
print(each)
5
7
13
17
22
31
32
Se nenhuma função for designada, os itens serão somados:
5
5 + 2 = 7
7 + 6 = 13
13 + 4 = 17
17 + 5 = 22
22 + 9 = 31
31 + 1 = 32
combinations()
Recebe um iterável e um inteiro. Isso criará todas as combinações exclusivas que têm r membros.
itertools.combinations(iterable, r)
Exemplo:
shapes = ['circle', 'triangle', 'square',]
# Gerar todas as combinações de 2 elementos
result = itertools.combinations(shapes, 2)
for each in result:
print(each)
('circle', 'triangle')
('circle', 'square')
('triangle', 'square')
combinations_with_replacement()
Assim como combinations(), mas permite que elementos individuais sejam repetidos mais de uma vez.
itertools.combinations_with_replacement(iterable, r)
Exemplo:
shapes = ['circle', 'triangle', 'square']
# Gerar combinações permitindo elementos repetidos
result = itertools.combinations_with_replacement(shapes, 2)
for each in result:
print(each)
('circle', 'circle')
('circle', 'triangle')
('circle', 'square')
('triangle', 'triangle')
('triangle', 'square')
('square', 'square')
count()
Cria um iterador que retorna valores espaçados uniformemente começando com o número start.
itertools.count(start=0, step=1)
Exemplo:
# Contar começando em 10, incrementando de 3 em 3
for i in itertools.count(10,3):
print(i)
if i > 20:
break
10
13
16
19
22
cycle()
Esta função percorre um iterável infinitamente.
itertools.cycle(iterable)
Exemplo:
colors = ['red', 'orange', 'yellow', 'green', 'blue', 'violet']
# Ciclar pelas cores infinitamente
for color in itertools.cycle(colors):
print(color)
red
orange
yellow
green
blue
violet
red
orange
Ao atingir o final do iterável, ele recomeça do início.
chain()
Pega uma série de iteráveis e os retorna como um único iterável longo.
itertools.chain(*iterables)
Exemplo:
colors = ['red', 'orange', 'yellow', 'green', 'blue']
shapes = ['circle', 'triangle', 'square', 'pentagon']
# Encadear múltiplos iteráveis em um só
result = itertools.chain(colors, shapes)
for each in result:
print(each)
red
orange
yellow
green
blue
circle
triangle
square
pentagon
compress()
Filtra um iterável com outro.
itertools.compress(data, selectors)
Exemplo:
shapes = ['circle', 'triangle', 'square', 'pentagon']
selections = [True, False, True, False]
# Filtrar formas com base em seleções booleanas
result = itertools.compress(shapes, selections)
for each in result:
print(each)
circle
square
dropwhile()
Cria um iterador que descarta elementos do iterável enquanto o predicado for verdadeiro; depois disso, retorna todos os elementos restantes.
itertools.dropwhile(predicate, iterable)
Exemplo:
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1]
# Descartar elementos enquanto a condição for verdadeira, depois retornar todos os restantes
result = itertools.dropwhile(lambda x: x<5, data)
for each in result:
print(each)
5
6
7
8
9
10
1
filterfalse()
Cria um iterador que filtra elementos do iterável, retornando apenas aqueles para os quais o predicado é Falso.
itertools.filterfalse(predicate, iterable)
Exemplo:
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1]
# Retornar elementos onde o predicado é Falso
result = itertools.filterfalse(lambda x: x<5, data)
for each in result:
print(each)
5
6
7
8
9
10
groupby()
Simplificando, esta função agrupa itens.
itertools.groupby(iterable, key=None)
Exemplo:
robots = [
{"name": "blaster", "faction": "autobot"},
{"name": "galvatron", "faction": "decepticon"},
{"name": "jazz", "faction": "autobot"},
{"name": "metroplex", "faction": "autobot"},
{"name": "megatron", "faction": "decepticon"},
{"name": "starcream", "faction": "decepticon"},
]
# Agrupar robôs por facção (o iterável deve estar ordenado para um agrupamento correto)
for key, group in itertools.groupby(robots, key=lambda x: x['faction']):
print(key)
print(list(group))
autobot
[{'name': 'blaster', 'faction': 'autobot'}]
decepticon
[{'name': 'galvatron', 'faction': 'decepticon'}]
autobot
[{'name': 'jazz', 'faction': 'autobot'}, {'name': 'metroplex', 'faction': 'autobot'}]
decepticon
[{'name': 'megatron', 'faction': 'decepticon'}, {'name': 'starcream', 'faction': 'decepticon'}]
islice()
Esta função é muito parecida com fatias (slices). Ela permite que você corte um pedaço de um iterável.
itertools.islice(iterable, start, stop[, step])
Exemplo:
colors = ['red', 'orange', 'yellow', 'green', 'blue',]
# Fatiar o iterável para obter os 2 primeiros elementos
few_colors = itertools.islice(colors, 2)
for each in few_colors:
print(each)
red
orange
permutations()
itertools.permutations(iterable, r=None)
Exemplo:
alpha_data = ['a', 'b', 'c']
# Gerar todas as permutações dos elementos
result = itertools.permutations(alpha_data)
for each in result:
print(each)
('a', 'b', 'c')
('a', 'c', 'b')
('b', 'a', 'c')
('b', 'c', 'a')
('c', 'a', 'b')
('c', 'b', 'a')
product()
Cria os produtos cartesianos de uma série de iteráveis.
num_data = [1, 2, 3]
alpha_data = ['a', 'b', 'c']
# Gerar o produto Cartesiano dos iteráveis
result = itertools.product(num_data, alpha_data)
for each in result:
print(each)
(1, 'a')
(1, 'b')
(1, 'c')
(2, 'a')
(2, 'b')
(2, 'c')
(3, 'a')
(3, 'b')
(3, 'c')
repeat()
Esta função repetirá um objeto repetidamente. A menos que haja um argumento times.
itertools.repeat(object[, times])
Exemplo:
# Repetir objeto 3 vezes
for i in itertools.repeat("spam", 3):
print(i)
spam
spam
spam
starmap()
Cria um iterador que calcula a função usando argumentos obtidos do iterável.
itertools.starmap(function, iterable)
Exemplo:
data = [(2, 6), (8, 4), (7, 3)]
# Aplicar função a argumentos desempacotados de cada tupla
result = itertools.starmap(operator.mul, data)
for each in result:
print(each)
12
32
21
takewhile()
O oposto de dropwhile(). Cria um iterador e retorna elementos do iterável enquanto o predicado for verdadeiro.
itertools.takewhile(predicate, iterable)
Exemplo:
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1]
# Pegar elementos enquanto a condição for verdadeira, depois parar
result = itertools.takewhile(lambda x: x<5, data)
for each in result:
print(each)
1
2
3
4
tee()
Retorna n iteradores independentes a partir de um único iterável.
itertools.tee(iterable, n=2)
Exemplo:
colors = ['red', 'orange', 'yellow', 'green', 'blue']
# Dividir o iterável em dois iteradores independentes
alpha_colors, beta_colors = itertools.tee(colors)
for each in alpha_colors:
print(each)
red
orange
yellow
green
blue
colors = ['red', 'orange', 'yellow', 'green', 'blue']
alpha_colors, beta_colors = itertools.tee(colors)
for each in beta_colors:
print(each)
red
orange
yellow
green
blue
zip_longest()
Cria um iterador que agrega elementos de cada um dos iteráveis. Se os iteráveis tiverem comprimentos desiguais, os valores ausentes são preenchidos com fillvalue. A iteração continua até que o iterável mais longo se esgote.
itertools.zip_longest(*iterables, fillvalue=None)
Exemplo:
colors = ['red', 'orange', 'yellow', 'green', 'blue',]
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10,]
# Juntar iteráveis, preenchendo valores ausentes com None
for each in itertools.zip_longest(colors, data, fillvalue=None):
print(each)
('red', 1)
('orange', 2)
('yellow', 3)
('green', 4)
('blue', 5)
(None, 6)
(None, 7)
(None, 8)
(None, 9)
(None, 10)