Hvad er Python Itertools-funktioner?

Ifølge Pythons dokumentation er Itertools et Python-modul, der giver et sæt hurtige og hukommelseseffektive værktøjer til at arbejde med Python-iteratorer. Disse værktøjer kan bruges alene eller i kombination, og de gør det muligt kortfattet og effektivt at skabe og arbejde med iteratorer på en hurtig og hukommelseseffektiv måde.

Itertools-modulet indeholder funktioner, der gør det nemmere at arbejde med iteratorer, især ved håndtering af store datasæt. Itertools-funktioner kan arbejde på eksisterende iteratorer for at skabe endnu mere komplekse Python-iteratorer.

Derudover kan Itertools hjælpe udviklere med at reducere fejl, når de arbejder med iteratorer og skrive renere, læsbar og vedligeholdelig kode.

Baseret på den funktionalitet, som iteratorerne i Itertools-modulet tilbyder, kan de klassificeres i følgende typer:

#1. Uendelige iteratorer

Disse er iteratorer, der giver dig mulighed for at arbejde med uendelige sekvenser og køre en løkke uendeligt, hvis der ikke er nogen betingelse for at bryde ud af løkken. Sådanne iteratorer er nyttige, når du simulerer uendelige sløjfer eller genererer en ubegrænset sekvens. Itertools har tre uendelige iteratorer, som inkluderer count(), cycle() og repeat().

#2. Kombinatoriske iteratorer

Kombinatoriske iteratorer omfatter funktioner, der kan bruges til at arbejde på kartesiske produkter og udføre kombinationer og permutationer af elementer indeholdt i en iterabel. Disse er de vigtigste funktioner, når man forsøger at finde alle mulige måder at arrangere eller kombinere elementer i en iterabel. Itertools har fire kombinatoriske iteratorer. Disse er produkt(), permutationer(), kombinationer() og kombinationer_med_erstatning().

#3. Iteratorer afsluttes på den korteste inputsekvens

Disse er afsluttende iteratorer, der bruges på endelige sekvenser og genererer et output baseret på den anvendte funktionstype. Eksempler på disse afsluttende iteratorer inkluderer: accumulate(), chain(), chain.from_iterable(), compress(), dropwhile(), filterfalse(), groupby(), islice(), parvis(), starmap(), takewhile (), tee() og zip_longest().

Lad os se på, hvordan forskellige Itertools-funktioner fungerer efter deres type:

Uendelige iteratorer

De tre uendelige iteratorer inkluderer:

#1. tælle()

Funktionen tælle(start, trin) genererer en uendelig talrække fra startværdien. Funktionen tager to valgfrie argumenter: start og trin. Argumentet start angiver, hvor rækkefølgen af ​​tal skal starte. Som standard starter den ved 0, hvis der ikke er angivet en startværdi. trin indstiller forskellen mellem hvert fortløbende tal. Standardtrinværdien er 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

Produktion

4
6
8
10
12

#2. cyklus()

cyklus(iterable)-funktionen tager en iterabel som et argument og går derefter gennem den iterable og giver adgang til elementer i den iterable i den rækkefølge, de vises.

For eksempel, hvis vi går ind [“red”, “green”, “yellow”] into cycle(), i den første cyklus har vi adgang til “red”; i anden cyklus har vi adgang til “grøn”, derefter “gul”. I den fjerde cyklus, da alle elementer er udtømt i den iterable, starter vi forfra ved “rød” og fortsætter derefter i det uendelige.

Når du kalder cycle(), gemmer du dets resultat i en variabel for at skabe en iterator, der bevarer sin tilstand. Dette sikrer, at cyklussen ikke starter forfra hver gang, hvilket giver dig adgang til kun det første element.

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))

Produktion:

red
green
yellow
red
green
yellow
red

#3. gentage()

repeat(elem,n) tager to argumenter, et element for at gentage (elem), og det antal gange, du vil gentage elementet(n). Det element, du vil gentage, kan være en enkelt værdi eller en iterabel. Hvis du ikke går ind, n, vil elementet blive gentaget uendeligt.

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

Produktion:

10 
10
10

Kombinatoriske iteratorer

De kombinatoriske iteratorer inkluderer:

  8 bedste værktøjer og software til datakvalitet [2022]

#1. produkt()

product() er en funktion, der bruges til at beregne det kartesiske produkt af den iterable, der sendes til den. Hvis vi har to iterabler eller mængder, for eksempel x = {7,8} og y = {1,2,3}, vil det kartesiske produkt af x og y indeholde alle mulige kombinationer af elementer fra x og y, hvor første element er fra x og det andet fra y. Det kartesiske produkt af x og y er i dette tilfælde [(7, 1), (7, 2), (7, 3), (8, 1), (8, 2), (8, 3)].

product() tager en valgfri parameter kaldet repeat, som bruges til at beregne det kartesiske produkt af en iterabel med sig selv. repeat angiver antallet af gentagelser for hvert element fra input iterables ved beregning af det kartesiske produkt.

For eksempel giver kald af product(‘ABCD’, repeat=2) kombinationer som (‘A’, ‘A’), (‘A’, ‘B’), (‘A’, ‘C’) og så på. Hvis gentagelse blev sat til 3, ville funktionen give kombinationer såsom (‘A’, ‘A’, ‘A’), (‘A’, ‘A’, ‘B’), (‘A’, ‘A’ , ‘C’), (‘A’, ‘A’, ‘D’) og så videre.

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])))

Produktion

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. permutationer()

permutations(iterable, group_size) returnerer alle mulige permutationer af den iterable, der er sendt ind i den. En permutation repræsenterer antallet af måder, elementer i et sæt kan bestilles på. permutations() tager et valgfrit argument group_size. Hvis group_size ikke er angivet, vil de genererede permutationer have samme størrelse som længden af ​​den iterable, der sendes til funktionen

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)

Produktion

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. kombinationer()

kombinationer(iterbar, størrelse) returnerer alle mulige kombinationer af en iterabel af en given længde fra elementerne i den iterable, der er overført til funktionen. Størrelsesargumentet angiver størrelsen af ​​hver kombination.

Resultaterne er bestilt. Kombination adskiller sig lidt fra permutationer. Med permutation betyder rækkefølgen noget, men med kombination er rækkefølgen ligegyldig. For eksempel i [A, B, C] der er 6 permutationer: AB, AC, BA, BC, CA, CB men kun 3 kombinationer 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)

Produktion:

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. kombinationer_med_erstatning()

kombinationer_med_erstatning(iterbar, størrelse) genererer alle mulige kombinationer af en iterabel af en given længde fra den iterable, der er overført til funktionen og giver mulighed for gentagne elementer i outputkombinationerne. Størrelsen bestemmer størrelsen af ​​de genererede kombinationer.

  Hvordan udfører man GCP-sikkerhedsscanning for at finde fejlkonfiguration?

Denne funktion adskiller sig fra kombinationer() ved, at den giver kombinationer, hvor et element kan gentages mere end én gang. For eksempel kan du få en kombination som (1,1), hvilket du ikke kan med kombination().

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)

Produktion

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)]

Afsluttende iteratorer

Dette inkluderer iteratorer som:

#1. ophobe()

accumulate(iterable, function) tager et iterbart og et andet valgfrit argument, som er en funktion. Det returnerer derefter det akkumulerede resultat af at anvende funktionen i hver iteration på elementer på den iterable. Hvis ingen funktion er bestået, tilføjes, og de akkumulerede resultater returneres.

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))

Produktion:

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

#2. kæde()

chain(iterable_1, iterable_2, …) tager flere iterables og kæder dem sammen og producerer en enkelt iterable indeholdende værdier fra de iterables, der er sendt til chain()-funktionen

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)

Produktion:

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

#3. chain.from_iterable()

chain.from_iterable(iterable) denne funktion ligner chain(). Den adskiller sig dog fra kæden ved, at den kun tager en enkelt iterabel indeholdende sub-iterables og kæder dem sammen.

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)

Produktion:

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

#4. komprimere()

compress(data, selectors) tager to argumenter ind, data, som er en iterabel, og selectors, som er en iterabel, der indeholder booleanske værdier sand og false. 1, 0 kan også bruges som alternativer til de boolske værdier sand og falsk. compress() filtrerer derefter de overførte data ved hjælp af de tilsvarende elementer, der sendes i vælgeren.

Værdier i data, der svarer til værdien sand eller 1 i vælgeren, vælges, mens resten, der svarer til falsk eller 0, ignoreres. Hvis du sender færre booleaner i vælgere end antallet af elementer i data, ignoreres alle elementer ud over de beståede booleaner i vælgere

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)

Produktion:

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

#5. dropwhile()

dropwhile(funktion, sekvens) tager en funktion ind med betingelsen, der returnerer sand eller falsk og en sekvens af værdier. Derefter taber den alle værdier, indtil den beståede betingelse returnerer False. Når betingelsen returnerer falsk, inkluderes resten af ​​elementerne i dens resultater, uanset om de returnerer True eller 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)

Produktion:

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

#6. filterfalse()

filterfalse(funktion, sekvens) tager en funktion ind med en betingelse, der evalueres til sand eller falsk og en sekvens. Den returnerer derefter værdier fra sekvensen, som ikke opfylder betingelsen i funktionen.

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)

Produktion:

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

#7. groupby()

groupby(iterable, key) tager en iterabel og en nøgle ind, og laver derefter en iterator, der returnerer på hinanden følgende nøgler og grupper. For at det kan fungere, skal den iterable, der sendes til den, sorteres på den samme nøglefunktion. Nøglefunktionscomputeren en nøgleværdi for hvert element i den iterable.

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))

Produktion:

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

#8. islice()

islice(iterbar, start, stop, trin) giver dig mulighed for at opdele en iterabel ved at bruge de beståede start-, stop- og trinværdier. Trin-argumentet er valgfrit. Optællingen starter fra 0 og punktet på stopnummeret er ikke inkluderet.

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)

Produktion:

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. parvis()

pairwise(iterable) returnerer successive overlappende par taget fra den iterable, der er overført til den i den rækkefølge, de vises i den iterable. Hvis den iterable, der sendes til den, har mindre end to værdier, vil resultatet fra pairwise() være tomt.

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)))

Produktion:

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

#10. starmap()

starmap(funktion, iterable) er en funktion, der bruges i stedet for map(), når argumentparametre allerede er grupperet i tupler. startmap() anvender en funktion på elementerne i den iterable, der er sendt til den. Den iterable skal have elementer grupperet i tupler.

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)))

Produktion:

[13, 5, 9, 16, 11]

#11. tage mens ()

takewhile(funktion, iterable) virker på den modsatte måde af dropwhile(). takewhile() tager en funktion med en betingelse, der skal evalueres, og en iterabel. Det inkluderer derefter alle elementer i iterablen, som opfylder betingelsen i funktionen, indtil False returneres. Når False er returneret, ignoreres alle følgende elementer i den iterable.

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)

Produktion:

[1, 2, 3, 4]

#12. tee()

tee(iterbar, n) tager en iterabel ind og returnerer flere uafhængige iteratorer. Antallet af iteratorer, der skal returneres, er angivet med n, som som standard er 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))

Produktion:

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

#13. zip_longest()

zip_longest(iterables, fillvalue) tager flere iteratorer og en fillvalue. Det returnerer derefter en iterator, der samler elementer fra hver af de iteratorer, der sendes til den. Hvis iteratorerne ikke er af samme længde, erstattes de manglende værdier med fyldværdien, der sendes til funktionen, indtil den længste iterable er opbrugt.

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)

Produktion:

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

Konklusion

Python itertools er et vigtigt værktøjssæt for en Python-udvikler. Python itertools bruges i vid udstrækning i funktionel programmering, databehandling og transformation, datafiltrering og udvælgelse, gruppering og aggregering, kombination af iterables, kombinatorik og når der arbejdes med uendelige sekvenser.

  Sådan tilføjer du noter i Photoshop-filer

Som Python-udvikler vil du få stor gavn af at lære om itertools, så sørg for at bruge denne artikel til at blive fortrolig med Python Itertools.