No fim da página do itertools existe uma seção chamada Itertools Recipes: uma coleção de funções úteis construídas combinando os blocos do módulo. Achatar uma lista de listas, achar o primeiro elemento que passa num teste, percorrer uma sequência em janelas: muita coisa que você escreveria na mão já está resolvida ali. As receitas não vêm prontas no itertools, a ideia é copiar pro seu código. Já usamos uma delas por aqui, a consume, no artigo sobre consumir iteráveis sem alocar memória. Separei três outras que valem a pena conhecer.
flatten achata um nível de listas aninhadas:
from itertools import chain
def flatten(list_of_lists):
return chain.from_iterable(list_of_lists)
list(flatten([[1, 2], [3, 4], [5]])) # [1, 2, 3, 4, 5]
first_true devolve o primeiro elemento que satisfaz uma condição, sem varrer o resto:
def first_true(iterable, default=False, predicate=None):
return next(filter(predicate, iterable), default)
first_true([2, 4, 7, 8], predicate=lambda x: x % 2) # 7
sliding_window percorre a sequência em janelas deslizantes:
from collections import deque
from itertools import islice
def sliding_window(iterable, n):
iterator = iter(iterable)
window = deque(islice(iterator, n - 1), maxlen=n)
for x in iterator:
window.append(x)
yield tuple(window)
list(sliding_window("ABCDE", 3)) # [('A','B','C'), ('B','C','D'), ('C','D','E')]
Algumas receitas fizeram tanto sucesso que viraram parte do módulo, como pairwise e batched. E se preferir tudo pronto e testado, o pacote more-itertools traz essas e muitas outras.
Então é isso, pessoal!
Até a próxima!
{}’s