Du har en liste med navn og en liste med poeng. Nå vil du gå gjennom begge samtidig. Eller du itererer over en liste og trenger indeksen til hvert element uten å holde tellingen manuelt. Det er her zip() og enumerate() gjør jobben enkel.
Slik fungerer zip() i Python
zip() tar to eller flere samlinger og parer elementene sammen, ett for ett. Det første elementet fra hver samling havner i en tuppel, deretter det andre, og så videre:
names = ["Sara", "Jonas", "Petra"]
scores = [85, 92, 78]
list(zip(names, scores))
Resultatet blir [("Sara", 85), ("Jonas", 92), ("Petra", 78)].
zip() returnerer et zip-objekt, som er en iterator. Du kan konvertere det til en liste for å se innholdet, men det vanligste er å bruke det direkte i en for-løkke:
for name, score in zip(names, scores):
print(f"{name} fikk {score} poeng")
Legg merke til at du pakker ut de to verdiene direkte i løkken. Du trenger ikke skrive pair[0] og pair[1].
zip() med mer enn to lister
zip() er ikke begrenset til to samlinger. Du kan pare sammen så mange du vil:
coords = ["x", "y", "z"]
values = [3, 4, 5]
units = ["m", "m", "m"]
list(zip(coords, values, units))
Resultatet blir [("x", 3, "m"), ("y", 4, "m"), ("z", 5, "m")].
Hvis samlingene har ulik lengde, stopper zip() ved den korteste. Har du tre navn og fem poeng, får du bare tre par.
Pakk ut med zip(*iterable)
Du kan også bruke zip() til å pakke ut en liste med tuples tilbake til separate lister. Stjerneoperatoren (*) gjør jobben:
pairs = [("x", 3), ("y", 4), ("z", 5)]
coords, values = zip(*pairs)
Nå inneholder coords tuppelen ("x", "y", "z") og values tuppelen (3, 4, 5).
Slik fungerer enumerate() i Python
enumerate() legger en teller på en samling. I stedet for å lage en tellervariabel selv, får du indeksen automatisk:
items = ["brød", "melk", "smør"]
list(enumerate(items))
Resultatet blir [(0, "brød"), (1, "melk"), (2, "smør")].
I en for-løkke pakker du ut indeks og verdi direkte:
for index, item in enumerate(items):
print(f"{index}: {item}")
Start enumerate() fra et annet tall
Som standard starter telleren på 0, men du kan velge et annet startpunkt med start-parameteren:
for number, item in enumerate(items, start=1):
print(f"{number}. {item}")
Nå får du 1. brød, 2. melk, 3. smør. Praktisk når du vil vise nummererte lister til brukeren.
Typiske bruksområder
zip() er nyttig når du har parallelle data som hører sammen. Tenk kolonner i et regneark: en kolonne med navn, en med e-poster, en med avdelinger. Med zip() kan du iterere gjennom alle tre samtidig uten å holde styr på indekser.
enumerate() er det du bruker når du trenger å vite hvor du er i en samling. For eksempel når du vil finne posisjonen til et bestemt element, eller når du bygger en nummerert meny.
Begge returnerer iteratorer, noe som betyr at de er minneeffektive. De lager ikke en ny liste i minnet, men genererer verdier etter hvert som du ber om dem. For store datasett er dette en fordel sammenlignet med å lage indeksvariabler og telle manuelt.
Har du jobbet med lister og tuples, gir zip() og enumerate() deg verktøyene til å jobbe med dem mer effektivt.
Pythons dokumentasjon har en fullstendig oversikt over zip() og enumerate().
Vil du se zip() og enumerate() brukt i praksis med oppgaver du kan løse selv? Python for nybegynnere dekker begge funksjonene sammen med resten av Pythons innebygde verktøy.



