Wist je dat Python duizenden externe bibliotheken heeft, maar de meest krachtige tools al zijn opgenomen in de standaardbibliotheek?

Deze serie heeft als thema 'verdieping in de Python Standaard Bibliotheek' en we willen elke standaardbibliotheek die veel voorkomt maar niet diepgaand wordt behandeld, één voor één onderzoeken.

Het doel is niet alleen een opsomming van functies, maar begrip van concepten door middel van praktische voorbeelden en het ontwikkelen van programmeervaardigheden, zodat je jouw Python-vaardigheden naar een hoger niveau kunt tillen.


Geavanceerd gebruik van collections: van basis tot praktische toepassing

1. Waarom beginnen met collections

collections biedt zeer efficiënte geavanceerde collecties die de ingebouwde Python datatypes (list, dict, tuple) aanvullen op het gebied van prestaties en structuur. Ze komen vaak voor in de praktijk, maar worden niet vaak diepgaand behandeld.

In dit artikel zullen we ons richten op vijf van de meest praktische klassen, en je vertellen 'waarom we ze gebruiken', 'hoe ze te gebruiken', en 'wanneer ze handig zijn'.


2. Counter – De basis voor frequentietelling, en meer

Tel alles!

Basisconcept

collections.Counter is een van de zeer nuttige klassen die zijn opgenomen in de standaardbibliotheek collections van Python. Het is letterlijk een "counter", dus je kunt het beschouwen als een speciale soort dictionary die is geoptimaliseerd om het aantal verschijningen (frequentie) van gegevens te tellen.

from collections import Counter

c = Counter(['a', 'b', 'c', 'a', 'b', 'a'])
print(c)  # Counter({'a': 3, 'b': 2, 'c': 1})

Door een iterabel object zoals een lijst, string, tuple of dictionary in te voeren, telt de datastructuur hoe vaak elk element voorkomt.


Belangrijkste functies en methodes

📌 Diverse initialisatiemethoden

Counter kan op verschillende manieren worden geïnitialiseerd, zodat je flexibeler data kunt analyseren.

from collections import Counter

print(Counter(['a', 'b', 'a']))
# Counter({'a': 2, 'b': 1}) → Lijst

print(Counter({'a': 2, 'b': 1}))
# Counter({'a': 2, 'b': 1}) → Dictionary

print(Counter(a=2, b=1))
# Counter({'a': 2, 'b': 1}) → Keyword arguments

📌 Toegang tot elementen

Counter werkt als een dict, maar wanneer je probeert toegang te krijgen tot een niet-bestaande sleutel, retourneert het in plaats van KeyError een 0.

c = Counter('hello')
print(c['l'])  # 2 (de letter 'l' verschijnt 2 keer)
print(c['x'])  # 0 ('x' verschijnt niet, maar in plaats van een fout geeft het 0)

📌 Elementen toevoegen/wijzigen

Je kunt waarden toevoegen aan bestaande elementen of ze direct wijzigen. Niet-bestaande sleutels worden automatisch toegevoegd.

c = Counter('hello')
c['l'] += 3
print(c)
# Counter({'l': 5, 'o': 1, 'h': 1, 'e': 1})

📌 most_common(n) – Extractie van vaak voorkomende elementen

Geeft een lijst van n elementen terug, gerangschikt op basis van hun frequentie.

c = Counter('banana')
print(c.most_common(2))
# [('a', 3), ('n', 2)] → 'a' verschijnt 3 keer en 'n' 2 keer

📌 elements() – Iterator die elementen herhaalt

Geeft een iterator die de betreffende elementen herhaalt op basis van hun telling.

c = Counter('banana')
print(list(c.elements()))
# ['b', 'a', 'a', 'a', 'n', 'n']

Let op, elementen met waarden van 0 of lager worden niet opgenomen.


📌 Ondersteuning voor wiskundige bewerkingen ( +, -, &, | bewerkingen tussen Counters)

Een van de krachtige punten van Counter is dat het wiskundige/sets bewerkingen ondersteunt.

c1 = Counter(a=3, b=1)
c2 = Counter(a=1, b=2)

print(c1 + c2)
# Counter({'a': 4, 'b': 3}) → gelijke sleutels worden samengevoegd

print(c1 - c2)
# Counter({'a': 2}) → negatieve waarden worden genegeerd, 'b' wordt overgeslagen omdat het negatief is

print(c1 & c2)
# Counter({'a': 1, 'b': 1}) → doorsnede, op basis van de minimumwaarde

print(c1 | c2)
# Counter({'a': 3, 'b': 2}) → unie, op basis van de maximumwaarde

Praktische voorbeelden

📌 Woordanalyse in een string
text = "the quick brown fox jumps over the lazy dog"
counter = Counter(text.split())
print(counter)
📌 Analyse van logfrequentie
logs = ['INFO', 'ERROR', 'INFO', 'DEBUG', 'ERROR', 'ERROR']
print(Counter(logs))  # Counter({'ERROR': 3, 'INFO': 2, 'DEBUG': 1})
📌 Tellen van duplicaten in een lijst
nums = [1, 2, 2, 3, 3, 3]
print(Counter(nums))  # Counter({3: 3, 2: 2, 1: 1})

Let op

  • Counter erft van dict, maar garandeert geen volgorde. Als volgorde nodig is, moet most_common() worden gebruikt.
  • Items worden niet verwijderd, zelfs als hun waarden 0 of lager zijn; dit moet mogelijk handmatig worden gefilterd.
c = Counter(a=3)
c.subtract({'a': 5})
print(c)  # Counter({'a': -2})  # Let op, items verdwijnen niet als de waarde 0 of lager wordt

Tip: Hoe je zonder initialisatie kunt accumuleren

counter = Counter()
with open("data.txt") as f:
    for line in f:
        counter.update(line.strip().split())

Samenvatting

collections.Counter is een krachtig hulpmiddel dat bijna essentieel is voor data-analyse, logverwerking en tekst mining. Voor beginners is het een eenvoudige tool voor frequentietelling, terwijl het voor gevorderden kan evolueren tot een geavanceerde verwerkingshulpmiddel door operaties en filtering te combineren.


Volgende aflevering voorspelling

  • defaultdict – Een wereld zonder KeyError, flexibeler dan dict! Blijf kijken voor de volgende aflevering!

Door de standaardbibliotheek 'diepgaand te begrijpen en correct te gebruiken', zal de kwaliteit van je code zeker verbeteren.