O que são funções do Python Itertools?

De acordo com a documentação do Python, Itertools é um módulo Python que fornece um conjunto de ferramentas rápidas e com eficiência de memória para trabalhar com iteradores Python. Essas ferramentas podem ser usadas sozinhas ou em combinação e possibilitam criar e trabalhar com iteradores de forma sucinta e eficiente, de maneira rápida e eficiente em termos de memória.

O módulo Itertools contém funções que facilitam o trabalho com iteradores, principalmente ao lidar com grandes conjuntos de dados. As funções do Itertools podem funcionar em iteradores existentes para criar iteradores Python ainda mais complexos.

Além disso, o Itertools pode ajudar os desenvolvedores a reduzir erros ao trabalhar com iteradores e escrever código mais limpo, legível e de fácil manutenção.

Com base na funcionalidade que os iteradores no módulo Itertools fornecem, eles podem ser classificados nos seguintes tipos:

#1. Iteradores Infinitos

Esses são iteradores que permitem que você trabalhe com sequências infinitas e execute um loop infinitamente se não houver nenhuma condição para sair do loop. Esses iteradores são úteis ao simular loops infinitos ou gerar uma sequência ilimitada. Itertools tem três iteradores infinitos, que incluem count(), cycle() e repeat().

#2. Iteradores Combinatórios

Iteradores combinatórios compreendem funções que podem ser usadas para trabalhar em produtos cartesianos e realizar combinações e permutações de elementos contidos em um iterável. Essas são as funções essenciais ao tentar encontrar todas as maneiras possíveis de organizar ou combinar elementos em um iterável. Itertools tem quatro iteradores combinatórios. Estes são product(), permutations(), combinações() e combinações_com_reposição().

#3. Iteradores terminando na sequência de entrada mais curta

Estes são iteradores de terminação que são usados ​​em sequências finitas e geram uma saída com base no tipo de função usada. Exemplos desses iteradores de terminação incluem: acumula(), chain(), chain.from_iterable(), compress(), dropwhile(), filterfalse(), groupby(), islice(), pairwise(), starmap(), takewhile (), tee() e zip_longest().

Vejamos como diferentes funções do Itertools funcionam de acordo com seu tipo:

Iteradores Infinitos

Os três iteradores infinitos incluem:

#1. contar()

A função count(start, step) gera uma sequência infinita de números a partir do valor inicial. A função recebe dois argumentos opcionais: start e step. O argumento start define onde a sequência de números deve começar. Por padrão, ele começa em 0 se um valor inicial não for fornecido. step define a diferença entre cada número consecutivo. O valor padrão da etapa é 1.

import itertools
# count starting at 4, making steps of 2  
for i in itertools.count(4, 2):
    # condition to end the loop avoiding infinite looping
    if i == 14:
        break
    else:
        print(i) # output - 4, 6, 8, 10, 12

Saída

4
6
8
10
12

#2. ciclo()

A função cycle(iterable) usa um iterável como um argumento e, em seguida, percorre o iterável, permitindo o acesso aos itens no iterável na ordem em que aparecem.

Por exemplo, se passarmos em [“red”, “green”, “yellow”] em cycle(), no primeiro ciclo, teremos acesso a “red”; no segundo ciclo teremos acesso ao “verde”, depois ao “amarelo”. No quarto ciclo, uma vez que todos os elementos foram esgotados no iterável, vamos recomeçar no “vermelho” e continuar infinitamente.

Ao chamar cycle() você armazena seu resultado em uma variável para criar um iterador que mantém seu estado. Isso garante que o ciclo não recomece todas as vezes, dando a você acesso apenas ao primeiro elemento.

import itertools

colors = ["red", "green", "yellow"]
# pass in colors into cycle()
color_cycle = itertools.cycle(colors)
print(color_cycle)

# range used to stop the infinite loop once we've printed 7 times
# next() used to return the next item from the iterator
for i in range(7):
    print(next(color_cycle))

Saída:

red
green
yellow
red
green
yellow
red

#3. repita()

repeat(elem,n) leva dois argumentos, um elemento para repetir (elem) e o número de vezes que você deseja repetir o elemento(n). O elemento que você deseja repetir pode ser um valor único ou iterável. Se você não passar, n, o elemento será repetido infinitamente.

import itertools
   
for i in itertools.repeat(10, 3):
    print(i)

Saída:

10 
10
10

Iteradores Combinatórios

Os iteradores combinatórios incluem:

  Como inverter uma imagem no iPhone [2023]

#1. produtos()

product() é uma função usada para calcular o produto cartesiano do iterável passado para ela. Se tivermos dois iteráveis ​​ou conjuntos, por exemplo, x = {7,8} e y = {1,2,3}, o produto cartesiano de x e y conterá todas as combinações possíveis de elementos de x e y, onde o primeiro elemento é de x e o segundo de y. O produto cartesiano de x e y neste caso é [(7, 1), (7, 2), (7, 3), (8, 1), (8, 2), (8, 3)].

product() recebe um parâmetro opcional chamado repeat que é usado para calcular o produto cartesiano de um iterável consigo mesmo. repeat especifica o número de repetições para cada elemento dos iteráveis ​​de entrada ao calcular o produto cartesiano.

Por exemplo, chamar product(‘ABCD’, repeat=2) produz combinações como (‘A’, ‘A’), (‘A’, ‘B’), (‘A’, ‘C’) e assim sobre. Se a repetição fosse definida como 3, a função produziria combinações como (‘A’, ‘A’, ‘A’), (‘A’, ‘A’, ‘B’), (‘A’, ‘A’ , ‘C’), (‘A’, ‘A’, ‘D’) e assim por diante.

from itertools import product
# product() with the optional repeat argument
print("product() with the optional repeat argument ")
print(list(product('ABC', repeat = 2)))

# product with no repeat
print("product() WITHOUT an optional repeat argument")
print(list(product([7,8], [1,2,3])))

Saída

product() with the optional repeat argument 
[('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'B'), ('B', 'C'), ('C', 'A'), ('C', 'B'), ('C', 'C')]
product() WITHOUT an optional repeat argument
[(7, 1), (7, 2), (7, 3), (8, 1), (8, 2), (8, 3)]

#2. permutações()

permutations(iterable, group_size) retorna todas as permutações possíveis do iterável passado para ele. Uma permutação representa o número de maneiras pelas quais os elementos de um conjunto podem ser ordenados. permutations() recebe um argumento opcional group_size. Se group_size não for especificado, as permutações geradas serão do mesmo tamanho que o comprimento do iterável passado para a função

import itertools
numbers = [1, 2, 3]
sized_permutations = list(itertools.permutations(numbers,2))
unsized_permuatations = list(itertools.permutations(numbers))

print("Permutations with a size of 2")
print(sized_permutations)
print("Permutations with NO size argument")
print(unsized_permuatations)

Saída

Permutations with a group size of 2
[(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]
Permutations with NO size argument
[(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]

#3. combinações()

combinações(iterável, tamanho) retorna todas as combinações possíveis de um iterável de um determinado comprimento dos elementos no iterável passado para a função. O argumento size especifica o tamanho de cada combinação.

Os resultados são ordenados. A combinação difere ligeiramente das permutações. Com permutação, a ordem importa, mas com combinação, a ordem não importa. Por exemplo, em [A, B, C] existem 6 permutações: AB, AC, BA, BC, CA, CB, mas apenas 3 combinações AB, AC, BC.

import itertools
numbers = [1, 2, 3,4]
size2_combination = list(itertools.combinations(numbers,2))
size3_combination = list(itertools.combinations(numbers, 3))

print("Combinations with a size of 2")
print(size2_combination)
print("Combinations with a size of 3")
print(size3_combination)

Saída:

Combinations with a size of 2
[(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]
Combinations with a size of 3
[(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)]

#4. combinações_com_reposição()

combinações_with_replacement(iterável, tamanho) gera todas as combinações possíveis de um iterável de um determinado comprimento do iterável passado para a função e permite elementos repetidos nas combinações de saída. O tamanho determina o tamanho das combinações geradas.

  17 servidores de hospedagem Hurtworld para encontrar sua tribo e sobreviver com estilo

Esta função difere de combinações() porque fornece combinações em que um elemento pode ser repetido mais de uma vez. Por exemplo, você pode obter uma combinação como (1,1) que não pode com a combinação ().

import itertools
numbers = [1, 2, 3,4]

size2_combination = list(itertools.combinations_with_replacement(numbers,2))
print("Combinations_with_replacement => size 2")
print(size2_combination)

Saída

Combinations_with_replacement => size 2
[(1, 1), (1, 2), (1, 3), (1, 4), (2, 2), (2, 3), (2, 4), (3, 3), (3, 4), (4, 4)]

Terminando iteradores

Isso inclui iteradores como:

#1. acumular()

acumule(iterable, function) recebe um iterável e um segundo argumento opcional que é uma função. Em seguida, ele retorna o resultado acumulado da aplicação da função em cada iteração nos elementos do iterável. Se nenhuma função for passada, a adição é feita e os resultados acumulados são retornados.

import itertools
import operator
numbers = [1, 2, 3, 4, 5]

# Accumulate the sum of numbers
accumulated_val = itertools.accumulate(numbers)
accumulated_mul = itertools.accumulate(numbers, operator.mul)
print("Accumulate with no function")
print(list(accumulated_val))
print("Accumulate with multiplication")
print(list(accumulated_mul))

Saída:

Accumulate with no function
[1, 3, 6, 10, 15]
Accumulate with multiplication
[1, 2, 6, 24, 120]

#2. corrente()

chain(iterable_1, iterable_2, …) pega vários iteráveis ​​e os encadeia, produzindo um único iterável contendo valores dos iteráveis ​​passados ​​para a função chain()

import itertools

letters = ['A', 'B', 'C', 'D']
numbers = [1, 2, 3]
colors = ['red', 'green', 'yellow']

# Chain letters and numbers together
chained_iterable = list(itertools.chain(letters, numbers, colors))
print(chained_iterable)

Saída:

['A', 'B', 'C', 'D', 1, 2, 3, 'red', 'green', 'yellow']

#3. chain.from_iterable()

chain.from_iterable(iterable) esta função é semelhante a chain(). No entanto, difere da cadeia porque leva apenas um único iterável contendo sub-iteráveis ​​e os encadeia.

import itertools

letters = ['A', 'B', 'C', 'D']
numbers = [1, 2, 3]
colors = ['red', 'green', 'yellow']

iterable = ['hello',colors, letters, numbers]
chain = list(itertools.chain.from_iterable(iterable))
print(chain)

Saída:

['h', 'e', 'l', 'l', 'o', 'red', 'green', 'yellow', 'A', 'B', 'C', 'D', 1, 2, 3]

#4. comprimir()

compress(data, selectors) aceita dois argumentos, data que é um iterável e seletores que é um iterável contendo valores booleanos true e false. 1, 0 também podem ser usados ​​como alternativas aos valores booleanos true e false. compress() então filtra os dados passados ​​usando os elementos correspondentes passados ​​no seletor.

Os valores nos dados que correspondem ao valor true ou 1 no seletor são selecionados, enquanto os demais que correspondem a false ou 0 são ignorados. Se você passar menos booleanos nos seletores do que o número de itens nos dados, todos os elementos além dos booleanos passados ​​nos seletores serão ignorados

import itertools

# data has 10 items
data = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']
# passing in 9 selector items
selectors = [True, False, 1, False, 0, 1, True, False, 1]

# Select elements from data based on selectors
filtered_data = list(itertools.compress(data, selectors))
print(filtered_data)

Saída:

['A', 'C', 'F', 'G', 'I']

#5. dropwhile()

dropwhile(function, sequence) recebe uma função com a condição que retorna true ou false e uma sequência de valores. Em seguida, descarta todos os valores até que a condição passada retorne False. Uma vez que a condição retorna false, o resto dos elementos são incluídos em seus resultados independentemente de retornarem True ou False.

import itertools

numbers = [1, 2, 3, 4, 5, 1, 6, 7, 2, 1, 8, 9, 0, 7]

# Drop elements until the passed condition is False
filtered_numbers = list(itertools.dropwhile(lambda x: x < 5, numbers))
print(filtered_numbers)

Saída:

[5, 1, 6, 7, 2, 1, 8, 9, 0, 7]

#6. filtrofalso()

filterfalse(function, sequence) recebe uma função, com uma condição que avalia como true ou false e uma sequência. Em seguida, ele retorna valores da sequência que não satisfazem a condição da função.

import itertools

numbers = [1, 2, 3, 4, 2, 3 5, 6, 5, 8, 1, 2, 3, 6, 2, 7, 4, 3]

# Filter elements for which condition is False
filtered_numbers = list(itertools.filterfalse(lambda x: x < 4, numbers))
print(filtered_numbers)

Saída:

[4, 5, 6, 5, 8, 6, 7, 4]

#7. groupby()

groupby(iterable, key) recebe um iterável e uma chave e, em seguida, cria um iterador que retorna chaves e grupos consecutivos. Para que funcione, o iterável passado para ele precisa ser classificado na mesma função chave. A função de chave calcula um valor de chave para cada elemento no iterável.

import itertools

input_list = [("Domestic", "Cow"), ("Domestic", "Dog"), ("Domestic", "Cat"),("Wild", "Lion"), ("Wild", "Zebra"), ("Wild", "Elephant")]
classification = itertools.groupby(input_list,lambda x: x[0])
for key,value in classification:
  print(key,":",list(value))

Saída:

Domestic : [('Domestic', 'Cow'), ('Domestic', 'Dog'), ('Domestic', 'Cat')]
Wild : [('Wild', 'Lion'), ('Wild', 'Zebra'), ('Wild', 'Elephant')]

#8. islice()

islice(iterable, start, stop, step) permite dividir um iterável usando os valores start, stop e step passados. O argumento da etapa é opcional. A contagem começa em 0 e o item no número de parada não é incluído.

import itertools

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]

# Select elements within a range
selected_numbers = list(itertools.islice(numbers, 2, 10))
selected_numbers_step= list(itertools.islice(numbers, 2, 10,2))
print("islice without setting a step value")
print(selected_numbers)
print("islice with a step value of 2")
print(selected_numbers_step)

Saída:

islice without setting a step value
[3, 4, 5, 6, 7, 8, 9, 10]
islice with a step value of 2
[3, 5, 7, 9]

#9. emparelhados()

pairwise(iterable) retorna pares sobrepostos sucessivos retirados do iterável passado para ele na ordem em que aparecem no iterável. Se o iterável passado para ele tiver menos de dois valores, o resultado de pairwise() ficará vazio.

from itertools import pairwise

numbers = [1, 2, 3, 4, 5, 6, 7, 8]
word = 'WORLD'
single = ['A']

print(list(pairwise(numbers)))
print(list(pairwise(word)))
print(list(pairwise(single)))

Saída:

[(1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8)]
[('W', 'O'), ('O', 'R'), ('R', 'L'), ('L', 'D')]
[]

#10. mapa estelar()

starmap(function, iterable) é uma função usada em vez de map() quando os parâmetros do argumento já estão agrupados em tuplas. startmap() aplica uma função aos elementos do iterável passado para ela. O iterável deve ter elementos agrupados em tuplas.

import itertools

iter_starmap = [(123, 63, 13), (5, 6, 52), (824, 51, 9), (26, 24, 16), (14, 15, 11)]
print (list(itertools.starmap(min, iter_starmap)))

Saída:

[13, 5, 9, 16, 11]

#11. demora()

takewhile(function, iterable) funciona de maneira oposta a dropwhile(). takewhile() recebe uma função com uma condição a ser avaliada e iterável. Em seguida, inclui todos os elementos no iterável que satisfazem a condição na função até que False seja retornado. Depois que False for retornado, todos os elementos a seguir no iterável serão ignorados.

import itertools

numbers = [1, 2, 3, 4, 5, 1, 6, 7, 2, 1, 8, 9, 0, 7]

# Drop elements until the passed condition is False
filtered_numbers = list(itertools.takewhile(lambda x: x < 5, numbers))
print(filtered_numbers)

Saída:

[1, 2, 3, 4]

#12. camiseta()

tee(iterável, n) recebe um iterável e retorna vários iteradores independentes. O número de iteradores a serem retornados é definido por n, que por padrão é 2.

import itertools

numbers = [1, 2, 3, 4, 5]

# Create two independent iterators from numbers
iter1, iter2 = itertools.tee(numbers, 2)
print(list(iter1))
print(list(iter2))

Saída:

[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]

#13. zip_longest()

zip_longest(iterables, fillvalue) aceita vários iteradores e um fillvalue. Em seguida, ele retorna um iterador que agrega elementos de cada um dos iteradores passados ​​para ele. Se os iteradores não tiverem o mesmo comprimento, os valores ausentes serão substituídos pelo fillvalue passado para a função até que o iterável mais longo seja esgotado.

import itertools

names = ['John', 'mathew', 'mary', 'Alice', 'Bob', 'Charlie', 'Fury']
ages = [25, 30, 12, 13, 42]

# Combine name and ages, filling in missing ages with a dash
combined = itertools.zip_longest(names, ages, fillvalue="-")

for name, age in combined:
    print(name, age)

Saída:

John 25
mathew 30
mary 12
Alice 13
Bob 42
Charlie -
Fury -

Conclusão

As itertools do Python são um conjunto de ferramentas importante para um desenvolvedor Python. As itertools do Python são usadas extensivamente em programação funcional, processamento e transformação de dados, filtragem e seleção de dados, agrupamento e agregação, combinação de iteráveis, combinatória e ao trabalhar com sequências infinitas.

  Como descobrir quem possui um site ou domínio

Como desenvolvedor Python, você se beneficiará muito ao aprender sobre itertools, portanto, certifique-se de usar este artigo para se familiarizar com Python Itertools.