In dieser Anleitung werden wir die Verwendung des Counter
-Objekts aus dem Python collections
-Modul erkunden.
Bei der Arbeit mit umfangreichen Sequenzen in Python, wie Listen oder Zeichenketten, ist es oft notwendig, die Häufigkeit des Auftretens einzelner Elemente zu ermitteln.
Ein Python-Dictionary kann dies zwar leisten, jedoch vereinfacht die Counter
-Klasse des collections
-Moduls diese Aufgabe, indem sie ein Objekt erstellt, das die Elemente und ihre Anzahl innerhalb einer Sequenz als Dictionary speichert.
Im Laufe dieser Anleitung werden Sie lernen, wie man:
- Das
Counter
-Objekt von Python verwendet. - Ein Python-Dictionary erstellt, um die Zählwerte von Elementen in einem Iterable zu speichern.
- Das Dictionary mittels des Python-Zählers mit einer vereinfachten Syntax neu erstellt.
- Operationen wie Aktualisieren, Subtrahieren und das Finden der Schnittmenge zwischen zwei
Counter
-Objekten durchführt. - Die am häufigsten vorkommenden Elemente mit der
most_common()
-Methode extrahiert.
Legen wir los!
Python Collections Modul und die Counter Klasse
Oftmals wird ein Python-Dictionary verwendet, um Elemente und ihre Häufigkeiten in einem Iterable zu speichern. Dabei werden die Elemente als Schlüssel und ihre Anzahl als Werte gespeichert.
Da die Counter
-Klasse Teil des integrierten collections
-Moduls von Python ist, kann sie wie folgt in Ihr Python-Skript importiert werden:
from collections import Counter
Nach dem Import kann ein Counter
-Objekt wie folgt instanziert werden:
<counter_object> = Counter(iterable)
Dabei gilt:
iterable
kann eine beliebige gültige Python-Iterable sein, z.B. eine Liste, eine Zeichenkette oder ein Tupel.- Die Elemente in der Iterable müssen hashbar sein.
Nun, da wir wissen, wie man Counter
zur Erzeugung von Zähler-Objekten aus beliebigen Python-Iterables nutzt, beginnen wir mit dem Programmieren.
Die Beispiele in diesem Tutorial sind in diesem GitHub-Gist zu finden.
Wie man ein Zählerobjekt aus Python Iterables erzeugt
Wir erstellen eine Python-Zeichenkette, nennen sie „Wort“ und geben ihr den Wert „Renaissance“.
>>> wort = "renaissance"
Unser Ziel ist es, ein Dictionary zu erstellen, in dem jeder Buchstabe der Zeichenkette so oft abgebildet wird, wie er in der Zeichenkette vorkommt. Ein möglicher Ansatz wäre die Nutzung von for-Schleifen wie folgt:
>>> buchstaben_zaehler = {}
>>> for buchstabe in wort:
... if buchstabe not in buchstaben_zaehler:
... buchstaben_zaehler[buchstabe] = 0
... buchstaben_zaehler[buchstabe] += 1
...
>>> buchstaben_zaehler
{'r': 1, 'e': 2, 'n': 2, 'a': 2, 'i': 1, 's': 2, 'c': 1}
Betrachten wir das obige Code-Snippet im Detail:
buchstaben_zaehler
wird als leeres Python-Dictionary initialisiert.- Die Zeichenkette
wort
wird durchlaufen. - Es wird geprüft, ob der
buchstabe
bereits im Dictionarybuchstaben_zaehler
existiert. - Wenn der
buchstabe
nicht existiert, wird er mit einem Wert von 0 hinzugefügt, und dann um 1 erhöht. - Bei jedem Vorkommen eines Buchstabens in der Zeichenkette wird der entsprechende Wert um 1 erhöht.
- Dieser Prozess wiederholt sich, bis die gesamte Zeichenkette verarbeitet wurde.
Wir haben das Dictionary buchstaben_zaehler
selbst erstellt, indem wir eine for-Schleife verwendet haben, um die Zeichenkette wort
zu durchlaufen.
Lassen Sie uns nun die Counter
-Klasse aus dem collections
-Modul nutzen. Um buchstaben_zaehler
zu erhalten, müssen wir nur die Zeichenkette wort
an Counter()
übergeben, ohne Iterables zu durchlaufen.
>>> from collections import Counter
>>> buchstaben_zaehler = Counter(wort)
>>> buchstaben_zaehler
Counter({'e': 2, 'n': 2, 'a': 2, 's': 2, 'r': 1, 'i': 1, 'c': 1})
Das Counter
-Objekt ist ebenfalls ein Python-Dictionary. Wir können die eingebaute Funktion isinstance()
verwenden, um dies zu überprüfen:
>>> isinstance(buchstaben_zaehler,dict)
True
Wie wir sehen, gibt isinstance(buchstaben_zaehler, dict)
True
zurück, was bestätigt, dass das Counter
-Objekt buchstaben_zaehler
eine Instanz der Python-Klasse dict
ist.
Ändern des Zählerobjekts
Bisher haben wir gelernt, wie man Counter
-Objekte aus Python-Zeichenketten erzeugt.
Counter
-Objekte können auch durch Aktualisierung mit Elementen aus einem anderen Iterable oder durch Subtrahieren eines anderen Iterables von ihnen verändert werden.
Aktualisieren eines Zählers mit Elementen aus einem anderen Iterable
Lassen Sie uns eine weitere Zeichenkette namens anderes_wort
initialisieren:
>>> anderes_wort = "effervescence"
Nehmen wir an, wir möchten das Counter
-Objekt buchstaben_zaehler
mit den Elementen aus der Zeichenkette anderes_wort
aktualisieren.
Wir können die Methode update()
auf das Counter
-Objekt buchstaben_zaehler
anwenden.
>>> buchstaben_zaehler.update(anderes_wort)
>>> buchstaben_zaehler
Counter({'e': 7, 'n': 3, 's': 3, 'c': 3, 'r': 2, 'a': 2, 'f': 2, 'i': 1, 'v': 1})
Die Ausgabe zeigt, dass das Counter
-Objekt aktualisiert wurde und nun auch die Buchstaben und die Anzahl ihrer Vorkommen aus anderes_wort
enthält.
Subtrahieren von Elementen aus einem anderen Iterable
Nun wollen wir den Wert von anderes_wort
vom Objekt buchstaben_zaehler
subtrahieren. Hierfür verwenden wir die Methode subtract()
. <counter-object>.subtract(<some-iterable>)
subtrahiert die Werte, die den Elementen in <some-iterable>
entsprechen, von <counter-object>
.
Subtrahieren wir anderes_wort
von buchstaben_zaehler
.
>>> buchstaben_zaehler.subtract(anderes_wort)
>>> buchstaben_zaehler
Counter({'e': 2, 'n': 2, 'a': 2, 's': 2, 'r': 1, 'i': 1, 'c': 1, 'f': 0, 'v': 0})
Wir sehen, dass die Werte, die den Buchstaben in anderes_wort
entsprechen, subtrahiert wurden, aber die hinzugefügten Schlüssel „f“ und „v“ nicht entfernt wurden. Sie sind jetzt dem Wert 0 zugeordnet.
Hinweis: Hier haben wir anderes_wort
, eine Python-Zeichenkette, an den Methodenaufruf subtract()
übergeben. Wir können auch ein Python-Counter
-Objekt oder ein anderes Iterable übergeben.
Schnittmenge zwischen zwei Counter-Objekten in Python
Gelegentlich kann es notwendig sein, die Schnittmenge zwischen zwei Python Counter
-Objekten zu finden, um zu ermitteln, welche Schlüssel in beiden Objekten vorhanden sind.
Erstellen wir ein Counter
-Objekt, nennen wir es buchstaben_zaehler_2
, aus der Zeichenkette anderes_wort
„effervescence“.
>>> anderes_wort = "effervescence"
>>> buchstaben_zaehler_2 = Counter(anderes_wort)
>>> buchstaben_zaehler_2
Counter({'e': 5, 'f': 2, 'c': 2, 'r': 1, 'v': 1, 's': 1, 'n': 1})
Wir können den Operator &
verwenden, um die Schnittmenge zwischen buchstaben_zaehler
und buchstaben_zaehler_2
zu ermitteln.
>>> buchstaben_zaehler & buchstaben_zaehler_2
Counter({'e': 2, 'r': 1, 'n': 1, 's': 1, 'c': 1})
Beachten Sie, wie wir die Schlüssel und die Anzahl der gemeinsamen Vorkommen der beiden Wörter erhalten. Sowohl ‚Renaissance‘ als auch ‚Effervescence‘ enthalten zwei Vorkommen von ‚e‘ und jeweils ein Vorkommen von ‚r‘, ’n‘, ’s‘ und ‚c‘ gemeinsam.
Die häufigsten Elemente mit most_common finden
Eine weitere häufige Operation für Python-Counter
-Objekte ist die Suche nach den am häufigsten vorkommenden Elementen.
Um die Top-k der häufigsten Elemente im Zähler abzurufen, kann die Methode most_common()
verwendet werden. Im folgenden Beispiel rufen wir most_common()
auf buchstaben_zaehler
auf, um die drei am häufigsten vorkommenden Buchstaben zu finden.
>>> buchstaben_zaehler.most_common(3)
(('e', 2), ('n', 2), ('a', 2))
Wir sehen, dass die Buchstaben „e“, „n“ und „a“ jeweils zweimal im Wort „Renaissance“ vorkommen.
Dies ist besonders nützlich, wenn der Zähler viele Einträge hat und man an den gängigsten Schlüsseln interessiert ist.
Fazit
Hier ist eine kurze Zusammenfassung der wichtigsten Erkenntnisse:
- Die
Counter
-Klasse aus dem integriertencollections
-Modul kann verwendet werden, um ein Dictionary mit den Zählwerten aller Elemente in einer Iterable zu erhalten. Es ist wichtig, sicherzustellen, dass alle Elemente in der Iterable hashbar sind. - Der Inhalt eines Python-
Counter
-Objekts kann mit dem Inhalt eines anderenCounter
-Objekts oder eines anderen iterierbaren Objekts aktualisiert werden, indem dieupdate()
-Methode mit der folgenden Syntax verwendet wird:counter1.update(counter2)
. Anstelle voncounter2
kann jedes Iterable verwendet werden. - Wenn der Inhalt eines der Iterables aus dem aktualisierten Zähler entfernt werden soll, kann die Methode
subtract()
verwendet werden:counter1.subtract(counter2)
. - Um die gemeinsamen Elemente zwischen zwei
Counter
-Objekten zu finden, kann der&
-Operator verwendet werden. Für zwei Zählerzähler1
undzähler2
gibtzähler1 & zähler2
die Schnittmenge der beiden Zählerobjekte zurück. - Um die k häufigsten Elemente in einem Zähler zu erhalten, kann die Methode
most_common()
verwendet werden.counter.most_common(k)
liefert die k häufigsten Elemente und die jeweiligen Anzahlen.
Als Nächstes werden wir das defaultdict
erkunden, eine weitere Klasse im collections
-Modul. defaultdict
kann anstelle eines regulären Python-Dictionaries verwendet werden, um fehlende Schlüssel zu behandeln.