Ich konnte keine verständliche Erklärung für die tatsächliche Verwendung der Python- itertools.groupby()
Funktion finden. Ich versuche Folgendes zu tun:
- Nehmen Sie eine Liste - in diesem Fall die untergeordneten
lxml
Elemente eines objektivierten Elements - Teilen Sie es anhand einiger Kriterien in Gruppen ein
- Dann iterieren Sie später über jede dieser Gruppen separat.
Ich habe die Dokumentation und die Beispiele überprüft , aber ich hatte Probleme, sie über eine einfache Liste von Zahlen hinaus anzuwenden.
Also, wie benutze ich von itertools.groupby()
? Gibt es eine andere Technik, die ich verwenden sollte? Hinweise auf eine gute "Voraussetzung" des Lesens wären ebenfalls willkommen.
Antworten:
WICHTIGER HINWEIS: Sie müssen zuerst Ihre Daten sortieren .
Der Teil, den ich nicht bekommen habe, ist der in der Beispielkonstruktion
k
ist der aktuelle Gruppierungsschlüssel undg
ein Iterator, mit dem Sie die durch diesen Gruppierungsschlüssel definierte Gruppe durchlaufen können. Mit anderen Worten, dergroupby
Iterator selbst gibt Iteratoren zurück.Hier ist ein Beispiel dafür mit klareren Variablennamen:
Dies gibt Ihnen die Ausgabe:
In diesem Beispiel
things
handelt es sich um eine Liste von Tupeln, bei denen das erste Element in jedem Tupel die Gruppe ist, zu der das zweite Element gehört.Die
groupby()
Funktion benötigt zwei Argumente: (1) die zu gruppierenden Daten und (2) die Funktion, mit der sie gruppiert werden sollen.Hier wird angegeben,
lambda x: x[0]
dassgroupby()
das erste Element in jedem Tupel als Gruppierungsschlüssel verwendet werden soll.Gibt in der obigen
for
Anweisunggroupby
drei Paare (Schlüssel, Gruppeniterator) zurück - einmal für jeden eindeutigen Schlüssel. Mit dem zurückgegebenen Iterator können Sie jedes einzelne Element in dieser Gruppe durchlaufen.Hier ist ein etwas anderes Beispiel mit denselben Daten unter Verwendung eines Listenverständnisses:
Dies gibt Ihnen die Ausgabe:
quelle
groupby(sorted(my_collection, key=lambda x: x[0]), lambda x: x[0]))
unter der Annahme, dassmy_collection = [("animal", "bear"), ("plant", "cactus"), ("animal", "duck")]
und Sie gruppieren möchten nachanimal or plant
Das Beispiel in den Python-Dokumenten ist recht einfach:
In Ihrem Fall handelt es sich bei Daten also um eine Liste von Knoten. Hier
keyfunc
wird die Logik Ihrer Kriterienfunktiongroupby()
gespeichert und anschließend werden die Daten gruppiert.Sie müssen darauf achten, die Daten nach den Kriterien zu sortieren, bevor Sie anrufen, sonst
groupby
funktioniert es nicht.groupby
Die Methode durchläuft tatsächlich nur eine Liste und erstellt bei jeder Änderung des Schlüssels eine neue Gruppe.quelle
keyfunc
und sagten: "Ja, ich weiß genau, was das ist, weil diese Dokumentation recht einfach ist." Unglaublich!itertools.groupby
ist ein Werkzeug zum Gruppieren von Elementen.Aus den Dokumenten entnehmen wir weiter, was es tun könnte:
groupby
Objekte ergeben Schlüssel-Gruppen-Paare, bei denen die Gruppe ein Generator ist.Eigenschaften
Vergleiche
Verwendet
Hinweis: Einige der letzteren Beispiele stammen aus Víctor Terróns PyCon (Diskussion) (Spanisch) "Kung Fu at Dawn with Itertools". Siehe auch den in C geschriebenen
groupby
Quellcode .* Eine Funktion, bei der alle Elemente durchlaufen und verglichen werden, um das Ergebnis zu beeinflussen. Andere Objekte mit Schlüsselfunktionen umfassen
sorted()
,max()
undmin()
.Antwort
quelle
[''.join(g) for k, g in groupby('AAAABBBCCD')] --> AAAA BBB CC D
.list()
,tuple()
) umgewandelt oder in einer Schleife / einem Verständnis verwendet werden, um den Inhalt anzuzeigen. Dies sind Redundanzen, die der Autor wahrscheinlich ausgeschlossen hat, um Platz zu sparen.Ein netter Trick mit groupby besteht darin, die Längencodierung in einer Zeile auszuführen:
Sie erhalten eine Liste mit 2 Tupeln, wobei das erste Element das Zeichen und das zweite die Anzahl der Wiederholungen ist.
Bearbeiten: Beachten Sie, dass dies
itertools.groupby
von der SQL-GROUP BY
Semantik abweicht: itertools sortiert den Iterator nicht im Voraus (und kann ihn im Allgemeinen nicht sortieren), sodass Gruppen mit demselben "Schlüssel" nicht zusammengeführt werden.quelle
Ein anderes Beispiel:
führt zu
Beachten Sie, dass igroup ein Iterator ist (ein Unteriterator, wie es in der Dokumentation genannt wird).
Dies ist nützlich, um einen Generator zu zerlegen:
Ein weiteres Beispiel für groupby - wenn die Schlüssel nicht sortiert sind. Im folgenden Beispiel werden Elemente in xx nach Werten in yy gruppiert. In diesem Fall wird zuerst ein Satz von Nullen ausgegeben, gefolgt von einem Satz von Einsen, gefolgt von einem Satz von Nullen.
Produziert:
quelle
WARNUNG:
Die Syntaxliste (groupby (...)) funktioniert nicht wie beabsichtigt. Es scheint die internen Iterator-Objekte zu zerstören, also mit
wird herstellen:
Versuchen Sie stattdessen anstelle von list (groupby (...)) [(k, list (g)) für k, g in groupby (...)], oder wenn Sie diese Syntax häufig verwenden,
und erhalten Sie Zugriff auf die Groupby-Funktionalität, während Sie diese lästigen (für kleine Daten) Iteratoren insgesamt vermeiden.
quelle
Ich möchte ein weiteres Beispiel geben, bei dem groupby ohne Sortierung nicht funktioniert. Nach Beispiel von James Sulak
Ausgabe ist
Es gibt zwei Gruppen mit Fahrzeugen, während man nur eine Gruppe erwarten kann
quelle
@CaptSolo, ich habe dein Beispiel ausprobiert, aber es hat nicht funktioniert.
Ausgabe:
Wie Sie sehen können, gibt es zwei O's und zwei E's, aber sie wurden in separate Gruppen eingeteilt. Da wurde mir klar, dass Sie die an die groupby-Funktion übergebene Liste sortieren müssen. Die richtige Verwendung wäre also:
Ausgabe:
Denken Sie daran, wenn die Liste nicht sortiert ist, funktioniert die Groupby-Funktion nicht !
quelle
quelle
Sie können groupby verwenden, um Dinge zu gruppieren, über die iteriert werden soll. Sie geben groupby eine iterable und eine optionale Schlüsselfunktion / callable, mit der Sie die Elemente überprüfen können, wenn sie aus der iterable herauskommen, und es wird ein Iterator zurückgegeben, der ein Zwei-Tupel des Ergebnisses der aufrufbaren Taste und der tatsächlichen Elemente in gibt eine andere iterable. Aus der Hilfe:
Hier ist ein Beispiel für die Gruppierung mithilfe einer Coroutine zum Gruppieren nach einer Zählung. Dabei wird ein Schlüssel verwendet, der (in diesem Fall
coroutine.send
) aufgerufen werden kann, um die Zählung für so viele Iterationen und einen gruppierten Unteriterator von Elementen auszuspucken:druckt
quelle
Ein nützliches Beispiel, auf das ich gestoßen bin, kann hilfreich sein:
Beispieleingabe: 14445221
Probenausgabe: (1,1) (3,4) (1,5) (2,2) (1,1)
quelle
Diese grundlegende Implementierung hat mir geholfen, diese Funktion zu verstehen. Hoffe, es hilft auch anderen:
quelle
Sie können eine eigene Groupby-Funktion schreiben:
quelle