Når man arbeider med iterasjonsstrukturer i Python, er det ofte nødvendig å fastslå antallet elementer som disse strukturene inneholder. Denne guiden viser hvordan du kan bruke Pythons innebygde funksjon for å beregne lengden på iterasjonsstrukturer, samt andre relaterte konsepter.
Python har et rikt utvalg av innebygde datastrukturer og en rekke metoder for å manipulere dem. I tillegg finnes det innebygde funksjoner som er svært nyttige når man arbeider med disse strukturene. En slik funksjon er `len()`, som returnerer antall elementer i en iterasjonsstruktur.
I denne veiledningen skal vi lære å bruke funksjonen `len()` med lister, tupler, strenger og andre datatyper. Vi vil også se på noen praktiske eksempler.
La oss begynne! 👩🏫
Syntaks for Pythons `len()`-funksjon
Her er den grunnleggende syntaksen for å bruke Pythons `len()`-funksjon:
len(iterable)
Som du ser, tar `len()`-funksjonen kun én parameter, som må være en gyldig iterasjonsstruktur. Dette kan for eksempel være en liste, en tuppel eller en streng, men det kan også være andre gyldige datatyper.
Syntaksen for `len()`-funksjonen er enkel. La oss nå se noen praktiske eksempler.
📑 Du kan følge eksemplene i denne guiden ved å bruke en Python REPL (Read-Eval-Print Loop).
Bruk av `len()`-funksjonen med iterasjonsstrukturer
Med sekvenser
Du kan bruke `len()`-funksjonen for å finne lengden på sekvenser som lister, tupler og strenger.
Her er et eksempel:
>>> tall = [9,3,6,1,2]
>>> len(tall)
5
>>> tall_tuppel = (9,3,6,1,2)
>>> len(tall_tuppel)
5
Når du jobber med sekvenser, vil du ofte bruke indekser eller utsnitt for å aksessere enkeltlementer eller deler av sekvensen.
Med andre samlinger
Funksjonen `len()` kan også brukes med andre Python-samlinger som sett og ordbøker.
Disse datastrukturene er uordnede samlinger. Selv om du kanskje ikke er opptatt av rekkefølgen på elementene, kan det være nyttig å vite det totale antallet elementer i samlingen.
>>> tall_sett = set(tall)
>>> len(tall_sett)
5
>>> priser = {'Notebook':5,'Pencil case':7,'Bookmarks':3,'Pens':1,'Markers':8}
>>> len(priser)
5
Vanlige bruksområder for Pythons `len()`-funksjon
Hittil har vi sett grunnleggende eksempler på hvordan du bruker `len()`-funksjonen til å finne antall elementer i en iterasjonsstruktur. La oss nå se hvordan vi kan bruke dette i praksis.
#1. Iterasjon med `for`-løkker
Pythons `for`-løkke gir en mekanisme for å iterere over elementene i en iterasjonsstruktur ved hjelp av syntaksen `for element in iterable`. Men hvis du trenger tilgang til indeksen til hvert element i stedet for selve elementet, eller til både indeksen og elementet, kan du bruke `range()`-funksjonen som vist her:
>>> tall = [9,2,4,7,8]
>>> for i in range(len(tall)):
... print(f"Indeks {i}: {tall[i]}")
Fordi `range(N)` genererer en sekvens av heltall fra 0 til N-1, vil `range(len(tall))` generere gyldige indekser vi kan bruke for å iterere over listen.
# Utdata
Indeks 0: 9
Indeks 1: 2
Indeks 2: 4
Indeks 3: 7
Indeks 4: 8
Den anbefalte og mer Python-vennlige måten å få tilgang til både indeks og element er imidlertid å bruke `enumerate()`-funksjonen:
>>> tall = [9,2,4,7,8]
>>> for idx, tall_verdi in enumerate(tall):
... print(f"Indeks {idx}: {tall_verdi}")
# Utdata
Indeks 0: 9
Indeks 1: 2
Indeks 2: 4
Indeks 3: 7
Indeks 4: 8
#2. Betinget iterasjon med `while`-løkker
Anta at du har en liste med tall, `tall`. Listemetoden `pop()` fjerner og returnerer det siste elementet i listen.
Så lenge lengden på `tall`-listen, `len(tall)`, er større enn null – er det minst ett element som kan fjernes.
>>> tall = [9,2,4,7,8]
>>> while len(tall) > 0:
... tall.pop()
# Utdata
8
7
4
2
9
Eksemplet over er en mer eksplisitt måte å skrive følgende på:
>>> tall = [9,2,4,7,8]
>>> while tall:
... tall.pop()
`while tall:` tilsvarer betingelsen «så lenge `tall`-listen ikke er tom».
#3. Sjekk og valider lengden på iterasjonsstrukturer
En annen vanlig bruk av `len()`-funksjonen er å sjekke og validere lengden på iterasjonsstrukturer.
Her kontrollerer vi om et brukernavn er en gyldig streng basert på lengden (beregnet ved hjelp av `len()`-funksjonen):
>>> brukernavn = "enda-et-tilfeldig-brukernavn"
>>> if len(brukernavn) > 10:
... print("Brukernavnet er for langt; det bør være maksimalt 10 tegn langt.")
... elif len(brukernavn) < 5:
... print("Brukernavnet er for kort; det bør være minst 5 tegn langt.")
... else:
... print("Gyldig brukernavn!")
Brukernavnet er for langt; det bør være maksimalt 10 tegn langt.
#4. Liste- og ordbokforståelser
Forståelser i Python gir en kort og presis syntaks for å generere nye iterasjonsstrukturer basert på eksisterende. Vi kan bruke innebygde funksjoner i en forståelse.
Listeforståelse
I denne listeforståelsen bruker vi funksjonen `len()` til å finne lengden på hver streng i listen `språk`.
>>> språk = ['Python','C','Rust','JavaScript']
>>> lengde_språk = [len(spr) for spr in språk]
>>> lengde_språk
[6, 1, 4, 10]
Ordbokforståelse
I denne ordbokforståelsen bruker vi listen `språk` og funksjonen `len()` til å konstruere en ordbok:
>>> språk = ['Python','C','Rust','JavaScript']
>>> språk_lengde = {spr:len(spr) for spr in språk}
>>> språk_lengde
{'Python': 6, 'C': 1, 'Rust': 4, 'JavaScript': 10}
Her er nøklene og verdiene henholdsvis strengene for språkene og lengden på disse strengene.
#5. `key`-parameter i tilpasset sortering
Python har den innebygde metoden `sort()` for å sortere lister i samme minneområde og funksjonen `sorted()` for å sortere lister og andre iterasjonsstrukturer.
I begge disse kan du bruke `key`-parameteren for å tilpasse sorteringen.
Her sorterer vi listen over språk basert på lengden av strengen.
>>> språk = ['Python','C','Rust','JavaScript']
>>> språk.sort(key=len)
>>> språk
['C', 'Rust', 'Python', 'JavaScript']
I koden nedenfor bruker vi `sorted()`-funksjonen for å få en sortert liste.
>>> språk = ['Hindi','Engelsk','Tysk','Fransk']
>>> sorted(språk,key=len)
['Hindi', 'Tysk', 'Fransk', 'Engelsk']
I dette eksemplet har både «Tysk» og «Fransk» 6 tegn hver. Fordi `sorted()`-funksjonen utfører en stabil sortering, blir rekkefølgen i den opprinnelige listen bevart.
#6. Lengde på NumPy-matriser
Du kan også bruke `len()`-funksjonen med andre datastrukturer som NumPy-matriser.
>>> import numpy as np
>>> np_matrise = np.array([3,4,6,9])
>>> type(np_matrise)
<class 'numpy.ndarray'>
>>> len(np_matrise)
4
I dette tilfellet er `np_matrise` en vektor med 4 elementer. `len(np_matrise)` returnerer altså 4, som er antall elementer i matrisen.
En matrise kan også være en todimensjonal struktur.
Se på følgende eksempel. `len(np_matrise)` er 2, som er antall rader.
>>> matrise = [[1,2,3],[4,5,6]]
>>> np_matrise = np.array(matrise)
>>> np_matrise
array([[1, 2, 3],
[4, 5, 6]])
>>> len(np_matrise)
2
For å forstå dette, la oss se tilbake på matrisen. Vi har en nestet listestruktur der den ytre listen inneholder to nestede lister. `len()`-funksjonen returnerer antall elementer i en beholder (her er det to lister):
>>> help(len)
Help on built-in function len in module builtins:
len(obj, /)
Returnerer antall elementer i en beholder.
Men når du begynner å jobbe med flerdimensjonale arrays, er det anbefalt å bruke `shape`-attributtet i stedet.
>>> np_matrise.shape
(2, 3)
Vanlige fallgruver du bør unngå når du bruker Pythons `len()`-funksjon
Til slutt, la oss se på noen vanlige fallgruver du bør unngå når du bruker `len()`-funksjonen i Python.
Bruk av `len()` med datatyper som ikke er iterasjonsstrukturer
Vi vet at `len()`-funksjonen kun tar gyldige iterasjonsstrukturer som argument. Dette betyr at hvis du kaller `len()`-funksjonen med en ugyldig datatype som ikke kan itereres, vil du få en feil.
Ugyldige datatyper inkluderer de grunnleggende datatypene som heltall, flyttall og boolske verdier:
>>> len(2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Objekt av typen 'int' har ingen lengde
>>> len(True)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Objekt av typen 'bool' har ingen lengde
>>> len(3.14)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Objekt av typen 'float' har ingen lengde
I Python er generatorer et minneeffektivt valg for situasjoner der du trenger å generere sekvenser. Et generatorobjekt returnerer elementene i sekvensen – etter behov – ett element om gangen. Men generatorobjekter har ingen lengde.
Du vil derfor få en feilmelding hvis du prøver å beregne lengden på et generatorobjekt:
>>> tall_kvadrat = (i*i for i in range(10))
>>> tall_kvadrat
<generator object <genexpr> at 0x0157DBC0>
>>> len(tall_kvadrat)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Objekt av typen 'generator' har ingen lengde
Bruk av `len()` med tupler av lengde én
Hvis du kun setter inn et element i en tuppel, vil Python tolke det som et enkelt element og ikke som en tuppel.
Her er et eksempel:
>>> tall = (1)
>>> len(tall)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Objekt av typen 'int' har ingen lengde
Så når du har en tuppel med kun ett element, initialiser den med denne formen: `tuppelnavn = (element,)` slik at den blir tolket som en tuppel:
>>> tall = (1,)
>>> len(tall)
1
Oppsummering
Her er en oppsummering av det vi har sett på i denne veiledningen:
- Du kan finne antall elementer i enhver iterasjonsstruktur ved å bruke `len()`-funksjonen i Python. Syntaksen for å bruke lengdefunksjonen er: `len(en-gyldig-iterasjonsstruktur)`.
- Dette inkluderer sekvenser som lister, tupler og strenger, samt andre samlinger som ordbøker og sett.
- Funksjonen `len()` brukes ofte i løkker og forståelser.
- Du kan også bruke `len()`-funksjonen som `key`-parameter når du skal tilpasse sortering etter lengde. For eksempel: sortering av en liste med strenger basert på lengden.
Neste steg er å lære hvordan du bruker Pythons `sum()`-funksjon.