Lær Python enumerate(): Få tilgang til indekser og elementer enkelt!

Denne veiledningen vil introdusere deg for hvordan du anvender `enumerate()`-funksjonen i Python.

`enumerate()`-funksjonen i Python tilbyr en konsis metode for å hente elementene i en itererbar struktur sammen med deres respektive indekser.

Vi begynner med å undersøke hvordan man aksesserer elementer og indekser ved bruk av enkel looping, og fortsetter deretter med å utforske syntaksen til Pythons `enumerate()`-funksjon. Vi vil også inkludere kodeeksempler underveis.

La oss starte.

Iterasjon ved hjelp av `for`-løkke i Python

Et Python-objekt som kan itereres over, der man kan hente hvert element individuelt, kalles en «iterable». Dette betyr at lister, tupler, ordbøker og strenger i Python er alle itererbare.

La oss se på et eksempel med en handleliste definert i kodeblokken nedenfor.

shopping_list = ["frukt","kjeks","kornblanding","proteinbarer","post-it lapper"]

I Python kan du anvende en `for`-løkke for å iterere gjennom alle itererbare objekter. Syntaksen for dette er:

for element in <iterable>:
    # utfør en handling på elementet

# element: løkkevariabel
# <iterable>: en hvilken som helst itererbar Python-struktur: liste, tuppel, ordbok, streng, osv.

Ved å bruke denne syntaksen kan vi nå iterere gjennom `shopping_list` og hente hvert enkelt element.

for element in shopping_list:
  print(element)

# Output
frukt
kjeks
kornblanding
proteinbarer
post-it lapper

Dette lar deg direkte få tilgang til elementene. Noen ganger kan det likevel være nødvendig å hente indeksen i tillegg til selve elementene.

Du kan benytte en indeksvariabel som økes inne i løkken, som demonstrert nedenfor:

index = 0
for element in shopping_list:
  print(f"index:{index}, {element}")
  index += 1

# Output
index:0, frukt
index:1, kjeks
index:2, kornblanding
index:3, proteinbarer
index:4, post-it lapper

Denne metoden er imidlertid ikke den mest effektive. Hvis du glemmer å oppdatere indeksen, vil ikke koden fungere som forventet.

index = 0
for element in shopping_list:
  print(f"index:{index}, {element}")
  # ingen oppdatering av index inne i løkken
  # index blir aldri oppdatert og er alltid 0

# Output
index:0, frukt
index:0, kjeks
index:0, kornblanding
index:0, proteinbarer
index:0, post-it lapper

Et annet vanlig mønster for bruk av `for`-løkker er i forbindelse med `range()`-funksjonen. Vi vil utforske dette i neste seksjon.

Bruk av `range()`-funksjonen for å hente indeksen

Pythons innebygde `len()`-funksjon returnerer lengden på et hvilket som helst Python-objekt. Du kan derfor bruke `len()` med `shopping_list` som argument for å få lengden på `shopping_list` (som er 5 i dette tilfellet).

len(shopping_list)
# Output: 5

`range()`-funksjonen returnerer et områdeobjekt som kan benyttes i en løkke. Når du itererer gjennom `range(stopp)`, henter du indeksene 0, 1, 2, …, `stopp-1`.

Ved å sette `stopp = len(liste)`, kan du hente listen over gyldige indekser. Ved bruk av `range()`-funksjonen, kan du aksessere både indeksen og det korresponderende elementet, som vist nedenfor.

for index in range(len(shopping_list)):
  print(f"index:{index}, element: {shopping_list[index]}")

# Output
index:0, element: frukt
index:1, element: kjeks
index:2, element: kornblanding
index:3, element: proteinbarer
index:4, element: post-it lapper

Dette er imidlertid ikke den anbefalte «Pythonic»-måten å samtidig aksessere både indekser og elementer.

Syntaks for Pythons `enumerate()`-funksjon

Pythons `enumerate()`-funksjon lar deg hente elementene sammen med deres indekser ved å bruke følgende generelle syntaks:

enumerate(<iterable>, start = 0)

I syntaksen over:

  • `<iterable>` er en obligatorisk parameter, og kan være en hvilken som helst itererbar Python-struktur, som en liste eller tuppel.
  • `start` er en valgfri parameter som definerer indeksen tellingen begynner på. Hvis ingen verdi angis for `start`, er den som standard null.

Du kan nå kalle `enumerate()`-funksjonen med `shopping_list` som argument, og den vil returnere et «enumerate»-objekt, som demonstrert i kodeblokken nedenfor.

enumerate(shopping_list)
<enumerate at 0x7f91b4240410>

Det «enumerate»-objektet kan ikke itereres direkte. Derfor konverterer vi objektet til en Python-liste.

list(enumerate(shopping_list))

# Output
[(0, 'frukt'),
 (1, 'kjeks'),
 (2, 'kornblanding'),
 (3, 'proteinbarer'),
 (4, 'post-it lapper')]

En annen måte å aksessere elementene i «enumerate»-objektet er ved å kalle `next()`-funksjonen med «enumerate»-objektet som argument. I Python returnerer `next()`-funksjonen det neste elementet fra en iterator.

Internt fungerer `next()`-funksjonen ved å kalle `__next__`-metoden på iteratorobjektet for å hente de påfølgende elementene.

La oss tilordne «enumerate»-objektet til variabelen `shopping_list_enum`.

shopping_list_enum = enumerate(shopping_list)

Når du først kaller `next()` med `shopping_list_enum`, får du indeks null og elementet på indeks 0: tuppelen `(0, «frukt»)`.

Når du fortsetter å kalle `next()`-funksjonen, får du de påfølgende elementene med deres respektive indekser, som beskrevet nedenfor.

next(shopping_list_enum)
# (0, 'frukt')
next(shopping_list_enum)
# (1, 'kjeks')
next(shopping_list_enum)
# (2, 'kornblanding')
next(shopping_list_enum)
# (3, 'proteinbarer')
next(shopping_list_enum)
# (4, 'post-it lapper')

Hva skjer dersom du kaller `next()`-funksjonen etter at alle elementer er hentet og man har nådd slutten av listen? Du vil motta en `StopIteration`-feil.

next(shopping_list_enum)
# ---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-16-4220f68f6c7e> in <module>()
----> 1 next(shopping_list_enum)

StopIteration:

`enumerate()`-funksjonen returnerer de påfølgende indeksene og elementene kun når de trengs, og beregnes ikke på forhånd. I Python-prosjekter der minneeffektivitet er viktig, kan du vurdere å bruke `enumerate()` når du skal iterere gjennom store mengder data.

Eksempler på Pythons `enumerate()`-funksjon

Nå som vi har lært om syntaksen for `enumerate()`, la oss justere `for`-løkken fra tidligere.

Fra forrige avsnitt vet vi at iterasjon gjennom «enumerate»-objektet gir en tuppel som inneholder indeksen og elementet. Vi kan pakke ut denne tuppelen i to variabler: `indeks` og `element`.

for indeks, element in enumerate(shopping_list):
  print(f"index:{indeks}, element:{element}")

# Output
index:0, element:frukt
index:1, element:kjeks
index:2, element:kornblanding
index:3, element:proteinbarer
index:4, element:post-it lapper

Deretter ser vi på hvordan du setter en tilpasset startverdi.

`enumerate()` med en tilpasset startverdi

Python bruker nullindeksering, så standard startverdi er 0. Men hvis du trenger indeksene i en mer lesbar form, for eksempel fra 1, eller en annen startverdi du måtte ønske, kan du spesifisere en tilpasset startverdi.

I `shopping_list`-eksemplet, hvis du ønsker å starte tellingen fra 1, setter du `start = 1`.

for indeks, element in enumerate(shopping_list,1):
  print(f"index:{indeks}, element:{element}")

# Output
index:1, element:frukt
index:2, element:kjeks
index:3, element:kornblanding
index:4, element:proteinbarer
index:5, element:post-it lapper

Når du angir en tilpasset startverdi, må du sørge for å angi den som det andre posisjonsargumentet.

Hvis du bytter om rekkefølgen på det itererbare objektet og startverdien, vil du få en feil, som forklart i kodeblokken nedenfor.

for indeks, element in enumerate(1,shopping_list):
  print(f"index:{indeks}, element:{element}")

# Output
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-12-5dbf7e2749aa> in <module>()
----> 1 for indeks, element in enumerate(1,shopping_list):
      2   print(f"index:{indeks}, element:{element}")

TypeError: 'list' object cannot be interpreted as an integer

For å unngå slike feil, kan du spesifisere start som et nøkkelordargument, som vist nedenfor.

for indeks, element in enumerate(shopping_list, start = 1):
  print(f"index:{indeks}, element:{element}")

# Output
index:1, element:frukt
index:2, element:kjeks
index:3, element:kornblanding
index:4, element:proteinbarer
index:5, element:post-it lapper

Så langt har du lært hvordan du bruker `enumerate()` med Python-lister. Du kan også bruke `enumerate()` til å iterere gjennom Python-strenger, ordbøker og tupler.

Bruk av `enumerate()` med Python-tupler

La oss anta at `shopping_list` er en tuppel. I Python er tupler også samlinger, lik lister, men de er uforanderlige. Derfor kan du ikke endre dem, og forsøk på å endre dem vil føre til feil.

Følgende kodebit initialiserer `shopping_list` som en tuppel.

shopping_list = ("frukt","kjeks","kornblanding","proteinbarer","post-it lapper")
type(shopping_list)
# Tuppel

Hvis du prøver å endre det første elementet i tuppelen, vil du motta en feilmelding fordi en Python-tuppel er en uforanderlig samling.

shopping_list[0] = 'grønnsaker'

# Output
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-ffdafa961600> in <module>()
----> 1 shopping_list[0] = 'grønnsaker'

TypeError: 'tuple' object does not support item assignment

▶ Kjør følgende kodebit for å bekrefte at `enumerate()` fungerer som forventet med tupler.

shopping_list = ("frukt","kjeks","kornblanding","proteinbarer","post-it lapper")
for index, element in enumerate(shopping_list):
    print(f"index:{index}, element:{element}")

Bruk av `enumerate()` med Python-strenger

Du kan også bruke Pythons `enumerate()`-funksjon til å iterere gjennom strenger og aksessere tegnene og indeksene samtidig.

Her er et eksempel:

py_str="Sommerfugl"
for index, char in enumerate(py_str):
  print(f"index {index}: {char}")

# Output
index 0: S
index 1: o
index 2: m
index 3: m
index 4: e
index 5: r
index 6: f
index 7: u
index 8: g
index 9: l

Fra utskriften over ser vi at tegnene sammen med deres indekser (0-9) er skrevet ut.

Konklusjon 👩🏽‍💻

Her er en oppsummering av hva du har lært:

  • Du kan bruke `for`-løkker for å hente elementene og opprettholde en separat teller- eller indeksvariabel.
  • Alternativt kan du bruke `range()`-funksjonen for å få de gyldige indeksene og hente elementene ved å indeksere inn i listen.
  • Som en anbefalt «Pythonic»-måte, kan du bruke Pythons `enumerate()`-funksjon med syntaksen: `enumerate(iterable)`. Som standard starter tellingen eller indeksen på 0.
  • Du kan spesifisere den tilpassede startverdien med syntaksen `enumerate(iterable, start)` for å få indeksen til å starte på `start`-verdien og hente de korresponderende elementene.
  • Du kan bruke `enumerate()`-funksjonen når du arbeider med tupler, strenger, ordbøker og generelt alle itererbare Python-strukturer.

Jeg håper denne veiledningen om `enumerate()`-funksjonen var nyttig. Deretter skal vi se på hvordan du finner indeksen til et element i Python-lister. Fortsett å kode!