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
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 vandict
, maar garandeert geen volgorde. Als volgorde nodig is, moetmost_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.
댓글이 없습니다.