Geekflare wordt ondersteund door ons publiek. We kunnen affiliate commissies verdienen met het kopen van links op deze site.
In Ontwikkeling Laatst bijgewerkt: 23 september 2023
Deel op:
Invicti beveiligingsscanner voor webtoepassingen - de enige oplossing die automatische verificatie van kwetsbaarheden levert met Proof-Based Scanning™.

Volgens de documentatie van Python is Itertools een Python-module die een set snelle en geheugenefficiënte hulpmiddelen biedt voor het werken met Python iteratoren. Deze tools kunnen afzonderlijk of in combinatie worden gebruikt en ze maken het mogelijk om op een beknopte en efficiënte manier iteratoren te maken en ermee te werken op een snelle en geheugenefficiënte manier.

De module Itertools bevat functies die het gemakkelijker maken om met iteratoren te werken, vooral bij het verwerken van grote gegevenssets. Itertools-functies kunnen op bestaande iteratoren werken om nog complexere Python iteratoren te maken.

Daarnaast kan Itertools ontwikkelaars helpen fouten te verminderen bij het werken met iteratoren en schonere, leesbare en onderhoudbare code te schrijven.

Soorten iteratoren in Python Itertools

Wat zijn Python-pakketten

Gebaseerd op de functionaliteit die de iteratoren in de Itertools module bieden, kunnen ze worden geclassificeerd in de volgende types:

#1. Eenindige Iteratoren

Dit zijn iteratoren die je toelaten om met oneindige reeksen te werken en een lus oneindig te laten lopen als er geen voorwaarde is om de lus te verbreken. Zulke iteratoren zijn handig bij het simuleren van oneindige lussen of het genereren van een onbegrensde reeks. Itertools heeft drie oneindige iteratoren, waaronder tellen(), cyclus() en herhalen().

#2. Combinatorische iteratoren

Combinatorische iteratoren bestaan uit functies die kunnen worden gebruikt om te werken met cartesische producten en om combinaties en permutaties uit te voeren van elementen in een iterabele. Dit zijn de functies die je moet gebruiken om alle mogelijke manieren te vinden om elementen in een iterabel te rangschikken of te combineren. Itertools heeft vier combinatorische iteratoren. Dit zijn product(), permutaties(), combinaties() en combinaties_met_vervanging().

#3. Iteratoren die eindigen op de kortste invoerreeks

Dit zijn terminerende iteratoren die gebruikt worden op eindige reeksen en een uitvoer genereren gebaseerd op het type van de gebruikte functie. Voorbeelden van deze terminerende iteratoren zijn: accumulate(), chain(), chain.from_iterable(), compress(), dropwhile(), filterfalse(), groupby(), islice(), pairwise(), starmap(), takewhile(), tee() en zip_langste().

Hoe maak je je eerste Python-pakket

Laten we eens kijken hoe verschillende Itertools functies werken volgens hun type:

Eenindige iteratoren

De drie eenindige iteratoren zijn:

#1. tellen()

De functie count(start, step) genereert een oneindige reeks getallen beginnend bij de startwaarde. De functie neemt twee optionele argumenten: start en niet. Het argument start stelt in waar de getallenreeks moet beginnen. Het begint standaard bij 0 als er geen startwaarde is opgegeven. niet stelt het verschil in tussen elk opeenvolgend getal. De standaard stapwaarde is 1.

import itertools
# tel vanaf 4, en maak stappen van 2 
voor i in itertools.count(4, 2):
   # voorwaarde om de lus te beëindigen om oneindige lussen te voorkomen
 als i == 14:
 break
 else:
 print(i) # uitvoer - 4, 6, 8, 10, 12

Uitvoer

4
6
8
10
12

#2. cyclus()

cycle(iterable) functie neemt een iterable als argument en cycles dan door de iterable waardoor toegang tot items in de iterable in de volgorde waarin ze verschijnen.

Als we bijvoorbeeld ["rood", "groen", "geel"] in cyclus() invoeren, hebben we in de eerste cyclus toegang tot "red"; in de tweede cyclus hebben we toegang tot "green", dan tot "yellow". In de vierde cyclus, omdat alle elementen in de iterable zijn uitgeput, zullen we opnieuw beginnen bij "rood" en dan oneindig doorgaan.

Wanneer je cycle() aanroept, sla je het resultaat op in een variabele om een iterator te maken die zijn status behoudt. Dit zorgt ervoor dat de cyclus niet elke keer opnieuw begint, waardoor je alleen toegang hebt tot het eerste element.

import itertools

colors = ["red", "green", "yellow"]
# geef kleuren door in cycle()
color_cycle = itertools.cycle(colors)
print(color_cycle)

# range gebruikt om de oneindige lus te stoppen zodra we 7 keer hebben afgedrukt
# next() gebruikt om het volgende element van de iterator terug te geven
for i in range(7):
 print(next(color_cycle))

Uitvoeren:

rood
groen
geel
rood
groen
geel
rood

#3. herhaal()

repeat(elem,n) heeft twee argumenten, een element om te herhalen(elem) en het aantal keren dat je het element wilt herhalen(n). Het element dat je wilt herhalen kan een enkele waarde of een iterable zijn. Als je geen n opgeeft, wordt het element oneindig herhaald.

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

Uitvoeren:

10 
10
10

Combinatorische iteratoren

De combinatorische iteratoren omvatten:

#1. product()

product() is een functie die wordt gebruikt om het cartesisch product te berekenen van de iterabele die eraan wordt doorgegeven. Als we twee iterabelen of verzamelingen hebben, bijvoorbeeld x = {7,8} en y = {1,2,3}, zal het cartesisch product van x en y alle mogelijke combinaties van elementen uit x en y bevatten, waarbij het eerste element uit x komt en het tweede uit y. Het cartesisch product van x en y in dit geval is [(7, 1), (7, 2), (7, 3), (8, 1), (8, 2), (8, 3)].

product() neemt een optionele parameter genaamd herhaal die wordt gebruikt om het cartesisch product van een iterable met zichzelf te berekenen. herhaal specificeert het aantal herhalingen voor elk element uit de invoer iterables bij het berekenen van het cartesisch product.

Bijvoorbeeld, het aanroepen van product('ABCD', repeat=2) levert combinaties op zoals ('A', 'A'), ('A', 'B'), ('A', 'C'), enzovoort. Als repeat is ingesteld op 3, zou de functie combinaties opleveren zoals ('A', 'A', 'A'), ('A', 'A', 'B'), ('A', 'A', 'C'), ('A', 'A', 'D'), enzovoort.

from itertools import product
# product() met het optionele herhalingsargument
print("product() met het optionele herhalingsargument ")
print(list(product('ABC', repeat = 2))

# product zonder herhalingsargument
print("product() ZONDER een optioneel herhalingsargument")
print(list(product([7,8], [1,2,3]))

Uitvoer

product() met het optionele herhalingsargument 
[('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'B'), ('B', 'C'), ('C', 'A'), ('C', 'B'), ('C', 'C')]
product() ZONDER een optioneel herhalingsargument
[(7, 1), (7, 2), (7, 3), (8, 1), (8, 2), (8, 3)]

#2. permutaties()

permutaties(iterable, groep_grootte) geeft alle mogelijke permutaties van de iterable die erin wordt doorgegeven. Een permutatie vertegenwoordigt het aantal manieren waarop elementen in een verzameling geordend kunnen worden. permutaties() neemt een optioneel argument groep_grootte. Als groep_grootte niet is opgegeven, zullen de gegenereerde permutaties zelfs groot zijn als de lengte van de iterabele die aan de functie is doorgegeven

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

print("Permutaties met een grootte van 2")
print(sized_permutations)
print("Permutaties zonder argument grootte")
print(unsized_permuatations)

Uitvoer

Permutaties met een groepsgrootte van 2
[(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]
Permutaties met GEEN GROOTTE-argument
[(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]

#3. combinaties()

combinations(iterable, grootte) retourneert alle mogelijke combinaties van een iterable van een gegeven lengte uit de elementen in de iterable die in de functie zijn doorgegeven. Het argument grootte specificeert de grootte van elke combinatie.

De resultaten worden geordend. Combinatie verschilt enigszins van permutaties. Bij permutatie doet de volgorde ertoe, maar bij combinatie doet de volgorde er niet toe. Bijvoorbeeld, in [A, B, C] zijn er 6 permutaties: AB, AC, BA, BC, CA, CB maar slechts 3 combinaties 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("Combinaties met een grootte van 2")
print(size2_combination)
print("Combinaties met een grootte van 3")
print(size3_combination)

Uitvoeren:

Combinaties met een grootte van 2
[(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]
Combinaties met een grootte van 3
[(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)]

#4. combinaties_met_vervanging()

combinations_with_replacement(iterable, grootte) genereert alle mogelijke combinaties van een iterable van een gegeven lengte uit de iterable die in de functie wordt doorgegeven en staat herhaalde elementen toe in de uitvoercombinaties. De grootte bepaalt de grootte van de gegenereerde combinaties.

Deze functie verschilt van combinaties() in die zin dat het combinaties geeft waarbij een element meer dan eens herhaald kan worden. Je kunt bijvoorbeeld een combinatie als (1,1) krijgen die je niet kunt krijgen met combinatie().

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

size2_combination = list(itertools.combinations_with_replacement(numbers,2))
print("Combinaties_met_vervanging => grootte 2")
print(size2_combination)

Uitvoer

Combinaties_met_vervanging => grootte 2
[(1, 1), (1, 2), (1, 3), (1, 4), (2, 2), (2, 3), (2, 4), (3, 3), (3, 4), (4, 4)]

Beëindigende iteratoren

Dit omvat iteratoren zoals:

#1. accumuleren()

accumulate(iterable, functie) neemt een iterable en een tweede optioneel argument dat een functie is. Het geeft dan het geaccumuleerde resultaat terug van het toepassen van de functie in elke iteratie op elementen in de iterable. Als er geen functie wordt doorgegeven, wordt er opgeteld en worden de geaccumuleerde resultaten geretourneerd.

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

# Accumuleer de som van getallen
accumulated_val = itertools.accumulate(numbers)
accumulated_mul = itertools.accumulate(numbers, operator.mul)
print("Accumuleer zonder functie")
print(list(accumulated_val))
print("Accumuleer met vermenigvuldiging")
print(list(accumulated_mul))

Uitvoeren:

Accumuleren zonder functie
[1, 3, 6, 10, 15]
Accumuleren met vermenigvuldiging
[1, 2, 6, 24, 120]

#2. ketting()

chain(iterable_1, iterable_2, ...) neemt meerdere iterabelen en ketent ze aan elkaar en produceert een enkele iterabel die waarden bevat van de iterabelen die zijn doorgegeven aan de chain() functie

import itertools

letters = ['A', 'B', 'C', 'D']
getallen = [1, 2, 3]
kleuren = ['rood', 'groen', 'geel']

# ketens letters en getallen aan elkaar
chained_iterable = list(itertools.chain(letters, getallen, kleuren))
print(chained_iterable)

Uitvoeren:

['A', 'B', 'C', 'D', 1, 2, 3, 'rood', 'groen', 'geel']

#3. keten.van_herhaalbare()

chain.from_iterable(iterable) deze functie is vergelijkbaar met chain(). Het verschilt echter van chain in het feit dat het slechts een enkele iterable neemt die subiterables bevat en deze aan elkaar ketent.

import itertools

letters = ['A', 'B', 'C', 'D']
getallen = [1, 2, 3]
kleuren = ['rood', 'groen', 'geel']

iterable = ['hallo',kleuren, letters, getallen]
chain = list(itertools.chain.from_iterable(iterable))
print(chain)

Uitvoeren:

['h', 'e', 'l', 'o', 'rood', 'groen', 'geel', 'A', 'B', 'C', 'D', 1, 2, 3]

#4. comprimeer()

compress(data, selectors) heeft twee argumenten, gegevens is een iterable en selecteurs is een iterable die de booleans true en false bevat. 1, 0 kunnen ook worden gebruikt als alternatieven voor de booleaanse waarden true en false. compress() filtert vervolgens de doorgegeven gegevens met behulp van de overeenkomstige elementen die zijn doorgegeven in de selecteur.

Waarden in gegevens die overeenkomen met de waarde Echt van 1 in de selector worden geselecteerd, terwijl de rest die overeenkomt met vals van 0 wordt genegeerd. Als je minder booleans in selecteurs doorgeeft dan het aantal items in gegevens worden alle elementen voorbij de doorgegeven booleans in selecteurs genegeerd

import itertools

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

# Selecteer elementen uit data op basis van selectors
filtered_data = list(itertools.compress(data, selectors))
print(filtered_data)

Uitvoeren:

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

#5. dropwhile()

dropwhile(functie, reeks) neemt een functie met de voorwaarde die waar of onwaar retourneert en een reeks waarden. Het laat dan alle waarden vallen totdat de doorgegeven voorwaarde Onwaar retourneert. Zodra de voorwaarde onwaar retourneert, worden de rest van de elementen opgenomen in de resultaten, ongeacht of ze Waar of Onwaar retourneert.

import itertools

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

# Laat elementen vallen totdat de doorgegeven voorwaarde False is
filtered_numbers = list(itertools.dropwhile(lambda x: x < 5, numbers))
print(filtered_numbers)

Uitvoeren:

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

#6. filterfalse()

filterfalse(functie, reeks) neemt een functie, met een voorwaarde die evalueert naar waar of onwaar en een reeks. Het retourneert dan waarden uit de reeks die niet voldoen aan de voorwaarde in de functie.

import itertools

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

# Filter elementen waarvoor de voorwaarde False is
filtered_numbers = list(itertools.filterfalse(lambda x: x < 4, numbers))
print(filtered_numbers)

Uitvoeren:

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

#7. groep()

groupby(iterable, key) neemt een iterable en een sleutel op en maakt dan een iterator die opeenvolgende sleutels en groepen teruggeeft. Om het te laten werken, moet de iterable die eraan wordt doorgegeven gesorteerd zijn op dezelfde sleutelfunctie. De sleutelfunctie berekent een sleutelwaarde voor elk element in de iterable.

import itertools

input_list = [("Binnenlands", "Koe"), ("Binnenlands", "Hond"), ("Binnenlands", "Kat"),("Wild", "Leeuw"), ("Wild", "Zebra"), ("Wild", "Olifant")]
classificatie = itertools.groupby(input_list,lambda x: x[0])
voor sleutel,waarde in classificatie:
 print(sleutel,":",lijst(waarde))

Uitgang:

Binnenlands : [('Binnenlands', 'Koe'), ('Binnenlands', 'Hond'), ('Binnenlands', 'Kat')]
Wild : [('Wild', 'Leeuw'), ('Wild', 'Zebra'), ('Wild', 'Olifant')]

#8. islice()

islice(iterable, start, stop, step) staat je toe om een iterable te slicen door de starten, stoppen en stap waarden. Het argument stap is optioneel. Tellen begint vanaf 0 en het item op het stop-argument wordt niet meegenomen.

import itertools

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

# Selecteer elementen binnen een bereik
selected_numbers = list(itertools.islice(numbers, 2, 10))
selected_numbers_step= list(itertools.islice(numbers, 2, 10,2))
print("islice zonder een stapwaarde in te stellen")
print(selected_numbers)
print("islice met een stapwaarde van 2")
print(selected_numbers_step)

Uitvoeren:

islice zonder een stapwaarde in te stellen
[3, 4, 5, 6, 7, 8, 9, 10]
islice met een stapwaarde van 2
[3, 5, 7, 9]

#9. paarsgewijs()

pairwise(iterable) retourneert opeenvolgende overlappende paren uit de iterable die wordt doorgegeven in de volgorde waarin ze in de iterable voorkomen. Als de iterable die wordt doorgegeven minder dan twee waarden heeft, zal het resultaat van pairwise() leeg zijn.

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

Uitvoeren:

[(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(functie, iterable) is een functie die wordt gebruikt in plaats van map() als de argumentparameters al zijn gegroepeerd in tuples. startmap() past een functie toe op de elementen van de iterable die eraan wordt doorgegeven. De iterable moet elementen hebben die zijn gegroepeerd in tuples.

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

Uitvoeren:

[13, 5, 9, 16, 11]

#11. takewhile()

takewhile(functie, iterable) werkt op de tegenovergestelde manier als dropwhile(). takewhile() neemt een functie met een voorwaarde die geëvalueerd moet worden en een iterable. Het bevat dan alle elementen in de iterable die voldoen aan de voorwaarde in de functie totdat False wordt geretourneerd. Zodra False wordt geretourneerd, worden alle volgende elementen in de iterable genegeerd.

import itertools

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

# Laat elementen vallen totdat de doorgegeven voorwaarde False is
filtered_numbers = list(itertools.takewhile(lambda x: x < 5, numbers))
print(filtered_numbers)

Uitvoeren:

[1, 2, 3, 4]

#12. tee()

tee(iterable, n) neemt een iterable op en geeft meerdere onafhankelijke iterators terug. Het aantal iteratoren dat wordt teruggegeven, wordt ingesteld door nwat standaard 2 is.

import itertools

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

# Maak twee onafhankelijke iteratoren van getallen
iter1, iter2 = itertools.tee(numbers, 2)
print(list(iter1))
print(list(iter2))

Uitvoeren:

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

#13. zip_langste()

zip_longest(iterables, fillvalue) neemt meerdere iterators en een fillvalue. Het geeft dan een iterator terug die elementen van elk van de doorgegeven iterators samenvoegt. Als de iteratoren niet even lang zijn, worden de ontbrekende waarden vervangen door de filwaarde die aan de functie is doorgegeven, totdat de langste iterabel is uitgeput.

import itertools

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

# Combineer naam en leeftijden en vul ontbrekende leeftijden aan met een streepje
combined = itertools.zip_longest(names, ages, fillvalue="-")

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

Uitvoeren:

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

Conclusie

Python itertools zijn een belangrijke toolset voor een Python-ontwikkelaar. Python itertools worden veel gebruikt bij functioneel programmerengegevensverwerking en -transformatie, filteren en selecteren van gegevens, groeperen en aggregeren, combineren van iterabelen, combinatoriek en bij het werken met oneindige reeksen.

Als Python-ontwikkelaar zul je veel baat hebben bij het leren kennen van itertools, dus zorg ervoor dat je dit artikel gebruikt om vertrouwd te raken met Python Itertools.

  • Collins Kariuki
    Auteur
    Collins Kariuki is een softwareontwikkelaar en technisch schrijver voor Geekflare. Hij heeft meer dan vier jaar ervaring in softwareontwikkeling, een achtergrond in computerwetenschappen en heeft ook geschreven voor Argot, Daily Nation en de Business Daily Newspaper.
  • Narendra Mohan Mittal
    Redacteur

    Narendra Mohan Mittal is een veelzijdige en ervaren digital branding strateeg en content editor met meer dan 12 jaar ervaring. Hij is een gouden medaillewinnaar in M-Tech en B-Tech in Computer Science & Engineering.


    Op dit moment... meer lezen

Met dank aan onze sponsors
Meer geweldige lezingen over ontwikkeling
Energie voor uw bedrijf
Enkele van de tools en services om je bedrijf te helpen groeien.
  • Invicti maakt gebruik van Proof-Based Scanning™ om de geïdentificeerde kwetsbaarheden automatisch te verifiëren en binnen enkele uren bruikbare resultaten te genereren.
    Probeer Invicti
  • Web scraping, residentiële proxy, proxy manager, web unlocker, zoekmachine crawler en alles wat je nodig hebt om webgegevens te verzamelen.
    Probeer Brightdata
  • Monday.com is een alles-in-één werk OS om je te helpen bij het beheren van projecten, taken, werk, verkoop, CRM, operaties, workflows en meer.
    Probeer maandag
  • Intruder is een online kwetsbaarhedenscanner die zwakke plekken in de cyberbeveiliging van uw infrastructuur vindt om kostbare datalekken te voorkomen.
    Probeer indringer