Python Counter: Mestre tellingen i lister og strenger!

Utforsk bruken av Counter-objektet i Python

I denne veiledningen skal vi fordype oss i hvordan du kan utnytte tellerobjektet fra Pythons samlingsmodul. Dette verktøyet er spesielt nyttig når du arbeider med lange sekvenser som lister eller strenger, der du trenger å spore forekomstene av hvert element.

Selv om en Python-ordbok kan tjene dette formålet, tilbyr `Counter`-klassen en mer strømlinjeformet tilnærming. Den fungerer som en spesialtilpasset ordbok som teller forekomstene av hvert element i en gitt sekvens.

I løpet av de kommende minuttene vil du lære:

  • Hvordan manipulere Python-tellerobjekter.
  • Hvordan konstruere en ordbok som lagrer forekomster av elementer i en iterabel.
  • Hvordan forenkle opprettelsen av en slik ordbok ved hjelp av `Counter`-klassen.
  • Hvordan utføre operasjoner som oppdatering, subtraksjon og finne felles elementer i tellerobjekter.
  • Hvordan hente de mest frekvente elementene i en teller ved hjelp av `most_common()`-metoden.

La oss begynne!

Python Samlingsmodul og `Counter`-klassen

Ofte vil du opprette en ordbok for å lagre elementer og deres tilhørende antall forekomster. I en slik ordbok fungerer elementene som nøkler, og antall forekomster som verdier.

Siden `Counter`-klassen er en del av Pythons samlingsmodul, kan du importere den slik:

from collections import Counter

Etter import kan du opprette et tellerobjekt som følger:

<teller_objekt> = Counter(itererbar)

Hvor:

  • `itererbar` er en hvilken som helst gyldig Python-itererbar, som en liste, streng eller tuppel.
  • Elementene i den itererbare må være hashbare.

Nå som vi har et grunnleggende grep om hvordan vi bruker `Counter`, la oss utforske noen praktiske eksempler. Alle kodene som brukes i denne opplæringen finnes i denne GitHub-repositoriet.

Hvordan generere et tellerobjekt fra Python Iterables

La oss begynne med å definere en Python-streng, for eksempel «eksempel», og kalle den `ord`.

>>> ord = "eksempel"

Vårt mål er å lage en ordbok hvor hver bokstav i `ord` er kartlagt til antall ganger den forekommer. En tilnærming er å bruke en `for`-løkke som vist:

>>> bokstav_antall = {}
>>> for bokstav in ord:
...     if bokstav not in bokstav_antall:
...         bokstav_antall[bokstav] = 0
...     bokstav_antall[bokstav] += 1
...
>>> bokstav_antall
{'e': 3, 'k': 1, 's': 1, 'm': 1, 'p': 1, 'l': 1}

La oss analysere denne kodebiten:

  • Vi initialiserer `bokstav_antall` som en tom ordbok.
  • Vi går gjennom hver bokstav i strengen `ord`.
  • For hver bokstav sjekker vi om den finnes i ordboken.
  • Hvis bokstaven ikke finnes, legges den til med verdien 0, deretter økes verdien med 1.
  • Dette fortsetter til vi har iterert gjennom hele strengen.

Vi har manuelt opprettet `bokstav_antall`-ordboken ved å bruke en `for`-løkke. La oss nå bruke `Counter`-klassen. Vi trenger bare å sende `ord`-strengen til `Counter()` for å få den samme `bokstav_antall`:

>>> from collections import Counter
>>> bokstav_antall = Counter(ord)
>>> bokstav_antall
Counter({'e': 3, 'k': 1, 's': 1, 'm': 1, 'p': 1, 'l': 1})

`Counter`-objektet er også en Python-ordbok. Vi kan bekrefte dette ved hjelp av `isinstance()`-funksjonen:

>>> isinstance(bokstav_antall,dict)
True

`isinstance(bokstav_antall, dict)` returnerer `True`, som bekrefter at tellerobjektet `bokstav_antall` er en forekomst av Python `dict`-klassen.

Endring av tellerobjektet

Vi har nå lært å lage tellerobjekter fra Python-strenger. Det er også mulig å endre tellerobjekter ved å oppdatere dem med elementer fra andre itererbare eller trekke fra dem.

Oppdatere en teller med elementer fra en annen itererbar

La oss initialisere en annen streng, `annet_ord`:

>>> annet_ord = "prøve"

Anta at vi ønsker å oppdatere tellerobjektet `bokstav_antall` med elementene fra `annet_ord`-strengen. Vi kan oppnå dette ved hjelp av `update()`-metoden:

>>> bokstav_antall.update(annet_ord)
>>> bokstav_antall
Counter({'e': 4, 'p': 2, 'k': 1, 's': 1, 'm': 1, 'l': 1, 'r': 1, 'ø': 1, 'v': 1})

Vi ser at tellerobjektet nå inkluderer bokstavene fra `annet_ord` og deres tilhørende antall.

Trekke fra elementer fra en annen itererbar

La oss nå trekke verdien av `annet_ord` fra `bokstav_antall`. For å gjøre dette, bruker vi `subtract()`-metoden. `<teller-objekt>.subtract(<en-itererbar>)` trekker verdiene av elementene i `<en-itererbar>` fra `<teller-objekt>`.

>>> bokstav_antall.subtract(annet_ord)
>>> bokstav_antall
Counter({'e': 3, 'k': 1, 's': 1, 'm': 1, 'l': 1, 'p': 0, 'r': 0, 'ø': 0, 'v': 0})

Vi ser at antall forekomster for bokstavene i `annet_ord` har blitt trukket fra. Nøkler som bare var i `annet_ord` har fått verdien 0, men er ikke fjernet.

Merk: Vi kan bruke andre itererbare, som et annet `Counter`-objekt, som argument til `subtract()`.

Felles elementer mellom to tellerobjekter

Noen ganger kan det være nyttig å finne felleselementene mellom to tellerobjekter for å identifisere overlappende nøkler.

La oss lage et tellerobjekt, for eksempel `bokstav_antall_2`, fra strengen `annet_ord`.

>>> annet_ord = "prøve"
>>> bokstav_antall_2 = Counter(annet_ord)
>>> bokstav_antall_2
Counter({'p': 1, 'r': 1, 'ø': 1, 'v': 1, 'e': 1})

Vi kan bruke `&`-operatoren for å finne felleselementene mellom `bokstav_antall` og `bokstav_antall_2`:

>>> bokstav_antall & bokstav_antall_2
Counter({'e': 1})

Vi har hentet de felles nøklene og antall forekomster. Både «eksempel» og «prøve» inneholder en forekomst av bokstaven «e».

Finne de mest frekvente elementene med `most_common`

En annen vanlig operasjon er å finne elementene med flest forekomster. Dette kan gjøres ved hjelp av `most_common()`-metoden:

For å finne de k mest frekvente elementene i en teller kan du bruke `most_common(k)`. I dette eksemplet finner vi de tre mest vanlige bokstavene i `bokstav_antall`:

>>> bokstav_antall.most_common(3)
[('e', 3), ('k', 1), ('s', 1)]

Vi ser at «e» forekommer tre ganger, mens «k» og «s» forekommer en gang hver.

Dette er spesielt nyttig når du har en stor samling og kun er interessert i de vanligste elementene.

Konklusjon

La oss oppsummere hva vi har lært:

  • `Counter`-klassen fra Pythons `collections`-modul gir deg en ordbok med tellinger for elementer i en hvilken som helst itererbar.
  • Du kan oppdatere innholdet i et `Counter`-objekt ved hjelp av `update()`-metoden. For eksempel `teller1.update(teller2)`, hvor `teller2` kan erstattes av en hvilken som helst itererbar.
  • For å trekke fra elementer, bruk `subtract()`-metoden som `teller1.subtract(teller2)`.
  • For å finne felles elementer, bruk `&`-operatoren: `teller1 & teller2`.
  • For å hente de k mest vanlige elementene, bruk `most_common(k)`, som gir de k vanligste elementene med deres respektive antall forekomster.

Neste skritt er å utforske bruken av `defaultdict`, en annen klasse i `collections`-modulen. `defaultdict` er et godt alternativ til vanlige Python-ordbøker når du skal håndtere manglende nøkler.