En av de fremtredende fordelene ved å benytte Python er dens brukervennlighet. Det er lett å arbeide med Python fordi standardbiblioteket stiller til disposisjon et bredt spekter av praktiske funksjoner. En slik funksjon er den innebygde sorted()
-funksjonen.
Denne funksjonen benyttes for å ordne elementene i en iterabel samling etter en spesifisert rekkefølge. Uten en slik funksjon ville man måtte skrive egen kode for å implementere en sorteringsalgoritme, som for eksempel boblesortering eller innsettingssortering. Dette kan være utfordrende, men Python tilbyr en enklere løsning som vi skal utforske i denne artikkelen.
Introduksjon til sorted()
-funksjonen
sorted()
-funksjonen er en innebygd funksjon i Python som har som formål å sortere itererbare objekter. En iterabel er en samling av verdier som det er mulig å traversere. Eksempler på iterabler inkluderer strenger, lister, tupler og sett. Disse iterablene er ofte usorterte, og sorteringen setter verdiene i en bestemt rekkefølge. Sortering av verdier er gunstig av flere grunner:
- Det gjør søk med algoritmer som binært søk raskere og mer effektivt. Binært søk krever imidlertid at verdiene er sortert på forhånd.
- Det gjør det mulig å vise verdier på en strukturert måte. Brukere foretrekker ofte å se informasjon ordnet, for eksempel laveste pris først eller nyeste innlegg øverst. Dette krever en metode for å sortere en liste over verdier.
- Det forenkler statistisk analyse, som for eksempel å identifisere den mest forekommende verdien i en samling. Dette blir enklere når verdiene er sortert i rekkefølge.
Bruksveiledning for sorted()
-funksjonen
Som nevnt tidligere, fungerer sorted()
-funksjonen med alle typer iterabler. Den returnerer imidlertid alltid en ny liste som er sortert. Det er viktig å merke seg at selv om inndataene kan være av en iterabel type, vil returverdien alltid være en liste.
Syntaks for sorted()
-funksjonen
Funksjonssignaturen for sorted()
-funksjonen ser slik ut:
sorted(iterable, key=None, reverse=False)
Det eneste obligatoriske argumentet er iterable
, som er samlingen av elementer som skal sorteres.
Det neste argumentet er key
. Dette argumentet tar inn en funksjon som brukes til å transformere hvert element i den iterable samlingen før sorteringen. Dette er spesielt nyttig når man skal sortere lister av ordbøker, som vi skal se nærmere på. Standardverdien for key
er None
, noe som betyr at ingen transformasjon av elementene vil skje med mindre en funksjon er spesifisert.
Det siste argumentet er reverse
. Hvis dette argumentet settes til True
, vil elementene bli sortert i omvendt rekkefølge.
I de følgende avsnittene vil vi bruke eksempler for å demonstrere hvordan funksjonen kan benyttes i praksis.
Eksempler på bruk av sorted()
-funksjonen
Liste over tall
Det enkleste scenariet for sortering er en liste med tall. Se på følgende kodeeksempel:
# En liste med usorterte tall numbers = [8, 4, 3, 9, 2, 0, 3] # Sortering av tallene sorted_numbers = sorted(numbers) # Skriver ut de sorterte tallene print(sorted_numbers)
Utskriften vil være:
[0, 2, 3, 3, 4, 8, 9]
Som vi kan se, er verdiene sortert i stigende rekkefølge. For å sortere verdiene i synkende rekkefølge, må argumentet reverse
settes til True
. Dermed ville linje 4 i det forrige kodeeksempelet vært:
sorted_numbers = sorted(numbers, reverse=True)
Resultatet av å kjøre det modifiserte programmet vil være:
[9, 8, 4, 3, 3, 2, 0]
Liste over strenger
sorted()
-funksjonen støtter mer enn bare tall. Den kan også brukes til å sortere strenger. Ved sortering av strenger i en liste, sammenlignes de første tegnene i strengene. Sammenligningene baseres på tegnenes ASCII-verdier. For eksempel vil «hei» komme før «verden» fordi ASCII-verdien til «h» er 104, som er mindre enn ASCII-verdien til «w», som er 119.
Dersom flere strenger har samme første tegn, vil de andre og påfølgende tegnene bli sammenlignet inntil en rekkefølge er fastslått. Her er et kodeeksempel der vi sorterer navn:
# Oppretter en liste med navn members_list = ['bob', 'dave', 'charlie', 'alice'] # Sorterer navnene sorted_members_list = sorted(members_list) # Skriver ut de sorterte navnene print(sorted_members_list)
Dette vil produsere følgende utskrift:
['alice', 'bob', 'charlie', 'dave']
Siden ASCII-verdier brukes, vil rekkefølgen av strenger avhenge av hvilket tegn som kommer først i ASCII-tabellen. For eksempel vil en stor bokstav komme før en liten bokstav fordi store bokstaver kommer før små bokstaver i ASCII-tabellen. Her er en komplett ASCII-tabell for referanse:
Kilde: commons.wikimedia.org
Andre iterabler – strenger, tupler og sett
Som tidligere nevnt, fungerer sorted()
-funksjonen med alle typer iterabler. De samme reglene gjelder for hvordan verdiene i de forskjellige iterablene skal sorteres. Her er et eksempel:
# Skriver ut en sortert streng print(sorted("dijkstra")) # Skriver ut en sortert tuppel av verdier print(sorted((3, 4, 2, 1, 5, 0))) # Skriver ut et sortert sett av verdier print(sorted(set([4, 5, 5, 1, 3, 8, 9])))
Resultatet av dette vil være:
['a', 'd', 'i', 'j', 'k', 'r', 's', 't'] [0, 1, 2, 3, 4, 5] [1, 3, 4, 5, 8, 9]
Som vi ser, er utskriften i hvert tilfelle en liste.
Liste over ordbøker
sorted()
-funksjonen kan også brukes til å sortere en liste med ordbøker. Imidlertid er det litt mer komplisert å sortere ordbøker. Dette er fordi, i motsetning til tall eller strenger, har en ordbok flere egenskaper, som hver kan være like gyldig for sammenligning.
Derfor, for å sortere ordbøker, må du spesifisere en funksjon som oppsummerer hele ordboken til en enkelt verdi som skal brukes til sammenligning. Denne funksjonen vil bli sendt til sorted()
-funksjonen som argumentet key
. Her er et eksempel for å illustrere dette:
people = [ { 'name': 'Alice', 'age': 27 }, { 'name': 'Bob', 'age': 23 }, { 'name': 'Charlie', 'age': 25} ] people_sorted_by_age = sorted(people, key=lambda person: person['age']) print(people_sorted_by_age)
I dette eksemplet har vi tre personer som er representert ved hjelp av en ordbok. Hver ordbok har et navn og en alder. Vi ønsker å sortere personene etter alder. Når vi kaller sorted()
-funksjonen, sender vi derfor inn en funksjon som key
-argument.
Denne funksjonen tar inn en person-ordbok og returnerer personens alder. Returverdien til key
-argumentet brukes til sortering. Dermed blir hele ordboken oppsummert til et enkelt heltall som kan sammenlignes. For enkelhets skyld har vi brukt en lambda-funksjon for å definere key
-argumentet.
Kjøring av koden vil produsere følgende utskrift:
[{'name': 'Bob', 'age': 23}, {'name': 'Charlie', 'age': 25}, {'name': 'Alice', 'age': 27}]
Bruk av key
-argumentet
key
-argumentet er ikke kun begrenset til bruk ved sortering av ordbøker. Det kan benyttes for alle typer verdier. Poenget er å spesifisere en nøkkel som kan brukes for å sortere verdiene. Her er noen eksempler på bruk:
- Sortering av verdier basert på lengden. Dette oppnås ved å definere en funksjon som returnerer lengden på verdien.
- Sortering av strenger uten hensyn til store eller små bokstaver. For å oppnå dette kan hver streng i listen konverteres til små bokstaver. Dette kan implementeres ved å definere en funksjon som tar inn en streng og returnerer en versjon med kun små bokstaver.
- Sortering av verdier basert på en sammensatt verdi som kombinerer verdiene til andre elementer.
Tidskompleksitet for sorted()
-funksjonen
sorted()
-funksjonen har en tidskompleksitet på O(n log n), der n er antallet elementer i den iterable samlingen. Denne kompleksiteten skyldes at funksjonen bruker Timsort-algoritmen, som er en hybrid sorteringsalgoritme basert på flettesortering og innsettingssortering.
Romkompleksiteten til funksjonen er O(n), der n er antallet elementer i inndataen. Dette skyldes at en ny liste opprettes og returneres.
sorted()
-funksjonen vs. sort()
-funksjonen
Et annet alternativ for å sortere verdier er sort()
-funksjonen. Dette avsnittet vil forklare de viktigste forskjellene mellom sorted()
– og sort()
-funksjonene.
sort()
-funksjonen endrer den iterable listen direkte (in-place), menssorted()
-funksjonen oppretter en ny liste og returnerer den.- Fordi endringene gjøres direkte, krever
sort()
-funksjonen at inndataene er en liste.sorted()
-funksjonen, derimot, kan ta en hvilken som helst iterabel som input, og vil deretter bruke den til å lage en ny liste som endres og returneres.
Avsluttende kommentarer
I denne artikkelen har vi gjennomgått sorted()
-funksjonen – hva den er, hvordan den brukes, og de ulike argumentene den tar. Vi har også dekket forskjellige bruksområder for funksjonen, tidskompleksiteten og sammenlignet den med sort()
-funksjonen.
Neste steg kan være å lese vår artikkel om Pythons sum()
-funksjon.