What is python function itemgetter?

Forstå Pythons operator.itemgetter() Funktion

18/06/2003

Rating: 4.44 (4293 votes)

Python er kendt for sit rige standardbibliotek, der tilbyder en bred vifte af værktøjer til at løse komplekse problemer på en elegant og effektiv måde. Et af de moduler, der ofte overses, men som indeholder utroligt nyttige funktioner, er operator-modulet. Dette modul stiller en række funktioner til rådighed, der svarer til Pythons indbyggede operatorer. I denne artikel vil vi dykke ned i en af de mest praktiske funktioner fra dette modul: operator.itemgetter(). Vi vil udforske, hvad den gør, hvordan den bruges, og hvorfor den ofte er et bedre valg end alternativer som lambda-funktioner, især når det kommer til sortering af data.

What is itemgetter() function?
In simpler words: that is just what operator.itemgetter(1) will give you: A function that grabs the first item from a list-like object. (More precisely those are callables, not functions, but that is a difference that can often be ignored.)
Indholdsfortegnelse

Hvad er operator.itemgetter()?

Kort sagt er operator.itemgetter() en funktion, der returnerer en anden funktion (en såkaldt 'callable'). Denne returnerede funktion er designet til at hente et eller flere elementer fra et objekt, der understøtter __getitem__()-metoden. Dette inkluderer datatyper som lister, tupler, strenge og ordbøger (dictionaries). Når du kalder itemgetter() med et argument (f.eks. et indeks eller en nøgle), skaber du en specialiseret funktion, der er optimeret til netop at hente det specifikke element. Hvis du angiver flere argumenter, vil den returnerede funktion hente alle disse elementer og returnere dem som en tuple.

Parametre og Returværdi

Funktionen kan kaldes på to måder:

  • operator.itemgetter(item): Henter et enkelt element.
  • operator.itemgetter(*items): Henter flere elementer.

Argumentet item kan være et heltal for sekvenser som lister og tupler (hvor det fungerer som et indeks) eller en hvilken som helst hashable type for mappings som ordbøger (hvor det fungerer som en nøgle). Returværdien fra den funktion, som itemgetter() skaber, vil være det eller de elementer, der blev hentet fra input-objektet.

Sådan Bruger Du itemgetter() i Praksis

For at bruge itemgetter() skal du først importere den fra operator-modulet. Det kan gøres på to måder, afhængigt af dine præferencer:

# Metode 1: Importer hele modulet import operator # Metode 2: Importer kun itemgetter-funktionen from operator import itemgetter

Metode 2 er ofte mere bekvem, da du kan kalde funktionen direkte med itemgetter() i stedet for operator.itemgetter(). I de følgende eksempler vil vi antage, at funktionen er importeret direkte.

Anvendelse på en Python Ordbog

En af de mest almindelige anvendelser er at hente værdier fra en ordbog baseret på en nøgle. Dette er især nyttigt, når man arbejder med lister af ordbøger.

from operator import itemgetter produkt_info = {'Produkt':'iPhone 14 Pro','Producent':'Apple', 'Pris': 9999} # Opret en funktion, der henter værdien for nøglen 'Produkt' hent_produktnavn = itemgetter('Produkt') # Kald den nye funktion med ordbogen print(hent_produktnavn(produkt_info)) # Output: iPhone 14 Pro

Her skaber itemgetter('Produkt') en funktion, der ved, at den skal slå nøglen 'Produkt' op. Dette er mere effektivt end at skrive en lambda-funktion som lambda x: x['Produkt'], især i loops eller funktioner som sorted() og map().

Anvendelse på en Python Liste

På samme måde kan du bruge itemgetter() til at hente elementer fra en liste baseret på deres indeks.

from operator import itemgetter operativsystemer = ["macOS", "Windows", "Linux", "Android"] # Få elementet på indeks 2 hent_tredje_element = itemgetter(2) print(hent_tredje_element(operativsystemer)) # Output: Linux # Hent flere elementer på én gang hent_foerste_og_sidste = itemgetter(0, 3) print(hent_foerste_og_sidste(operativsystemer)) # Output: ('macOS', 'Android')

Bemærk, hvordan itemgetter(0, 3) returnerer en tuple med de ønskede elementer. Dette er en utrolig kompakt og læsbar måde at udtrække flere data på.

Avanceret Sortering med itemgetter()

Den virkelige styrke ved itemgetter() viser sig, når den bruges som key-argument i sorteringsfunktioner. Forestil dig, at du har en liste af ordbøger, der repræsenterer forskellige produkter, og du vil sortere dem.

from operator import itemgetter telefoner = [ {'Model':'iPhone 14', 'Pris': 7500}, {'Model':'Samsung Galaxy S23', 'Pris': 7200}, {'Model':'OnePlus 11', 'Pris': 5800} ] 

Sortering efter Navn (Alfabetisk)

For at sortere listen alfabetisk efter modelnavn, kan vi blot give itemgetter('Model') til sorted()-funktionen.

Is operator itemgetter 'neater' than lambda a?
The top answer claims that operator.itemgetter(x) is "neater" than, presumably, than lambda a: a[x]. I feel the opposite is true. Are there any other benefits, like performance? As asked, I guess the right answer to your question is "Never". But in fact you wanted to know about situations where you cannot use [x] just so.
# Sorter efter 'Model'-nøglen sorteret_efter_model = sorted(telefoner, key=itemgetter('Model')) print(sorteret_efter_model) # Output: # [{'Model': 'iPhone 14', 'Pris': 7500}, # {'Model': 'OnePlus 11', 'Pris': 5800}, # {'Model': 'Samsung Galaxy S23', 'Pris': 7200}]

Funktionen sorted() kalder internt itemgetter('Model') for hvert element (hver ordbog) i listen for at få den værdi, der skal bruges til sammenligning.

Sortering efter Pris (Lavest til Højest)

Hvis vi i stedet vil sortere efter pris, ændrer vi blot argumentet til itemgetter.

# Sorter efter 'Pris'-nøglen sorteret_efter_pris = sorted(telefoner, key=itemgetter('Pris')) print(sorteret_efter_pris) # Output: # [{'Model': 'OnePlus 11', 'Pris': 5800}, # {'Model': 'Samsung Galaxy S23', 'Pris': 7200}, # {'Model': 'iPhone 14', 'Pris': 7500}]

Dette viser, hvor fleksibel og letlæselig denne tilgang er. Det er en meget mere deklarativ måde at specificere en sortering på end at skrive en fuld funktion eller en lambda.

Sammenligning: itemgetter() vs. attrgetter()

I operator-modulet findes også en lignende funktion ved navn attrgetter(). Det er vigtigt at kende forskellen, da de bruges i forskellige sammenhænge.

FunktionBeskrivelseAnvendelse
operator.itemgetter()Henter et element ved hjælp af operandens __getitem__()-metode.Bruges til sekvenser og mappings (lister, tupler, ordbøger). F.eks. liste[i] eller ordbog['nøgle'].
operator.attrgetter()Henter en attribut fra et objekt ved hjælp af navnet.Bruges til objekter med attributter. F.eks. objekt.navn eller objekt.pris.

Typiske Fejl og Hvordan Man Undgår Dem

En almindelig fejl for begyndere er at glemme, hvor funktionen kommer fra, hvilket fører til en NameError.

# Forkert kode - 'itemgetter' er ikke defineret globalt b = [(7,1), (3,3), (4,2)] sorted(b, key=itemgetter(1)) # Output: # NameError: name 'itemgetter' is not defined

Fejlen opstår, fordi Python ikke ved, hvad itemgetter er. Du skal eksplicit fortælle Python, at den kommer fra operator-modulet. Løsningen er at sikre, at du har en korrekt import-sætning i toppen af din fil:

from operator import itemgetter b = [(7,1), (3,3), (4,2)] # Korrekt - nu virker det sorted(b, key=itemgetter(1))

Ofte Stillede Spørgsmål (FAQ)

Er itemgetter() bedre end en lambda-funktion?

I mange tilfælde, ja. Der er to primære fordele ved at bruge itemgetter() frem for lambda:

  1. Ydeevne:itemgetter() er typisk hurtigere. Fordi den er implementeret i C, er den mere effektiv end en tilsvarende lambda-funktion, der fortolkes af Python. Forskellen er måske ikke mærkbar for små datasæt, men for store lister kan det have en betydelig indvirkning.
  2. Læsbarhed: Koden bliver ofte renere og mere koncis. key=itemgetter('pris', 'producent') er for mange udviklere mere læsbart og udtryksfuldt end key=lambda x: (x['pris'], x['producent']).

Kan jeg sortere i omvendt rækkefølge?

Ja, men det styres ikke af itemgetter(). Du kan sortere i faldende rækkefølge ved at tilføje argumentet reverse=True til sorted()-funktionen.

from operator import itemgetter # Sorterer efter pris fra højest til lavest sorteret_faldende = sorted(telefoner, key=itemgetter('Pris'), reverse=True)

Hvordan sorterer jeg efter mere end ét kriterium?

Du kan give flere argumenter til itemgetter(). Python vil så udføre en stabil sortering baseret på en tuple af værdierne i den rækkefølge, du angiver. Hvis du f.eks. vil sortere en liste af personer først efter efternavn og derefter efter fornavn, kan du gøre følgende:

personer = [ {'fornavn': 'Jens', 'efternavn': 'Hansen'}, {'fornavn': 'Anna', 'efternavn': 'Jensen'}, {'fornavn': 'Peter', 'efternavn': 'Hansen'} ] sorteret_personer = sorted(personer, key=itemgetter('efternavn', 'fornavn')) # Output: # [{'fornavn': 'Jens', 'efternavn': 'Hansen'}, # {'fornavn': 'Peter', 'efternavn': 'Hansen'}, # {'fornavn': 'Anna', 'efternavn': 'Jensen'}]

Her sorteres først efter 'Hansen' og 'Jensen'. Da der er to med efternavnet 'Hansen', bruges det andet kriterium, 'fornavn', til at placere 'Jens' før 'Peter'.

Konklusion

operator.itemgetter() er et kraftfuldt værktøj i enhver Python-udviklers arsenal. Det tilbyder en hurtig, læsbar og effektiv måde at tilgå elementer i datastrukturer. Især når det kommer til sortering af lister med komplekse objekter som ordbøger, skinner itemgetter() ved at levere en elegant og performance-optimeret løsning. Næste gang du står over for en sorteringsopgave eller har brug for at udtrække data i et map-kald, så overvej at bruge itemgetter() – din kode vil takke dig for det.

Hvis du vil læse andre artikler, der ligner Forstå Pythons operator.itemgetter() Funktion, kan du besøge kategorien Sundhed.

Go up