ich hantiere gerade mit dem Modul itertool herum, und bin dabei auf die groupby()-Funktion gestoßen.
Im Laufe meiner Recherche habe ich mir folgenden Schnipsel zusammengebastelt:
Code: Alles auswählen
from itertools import groupby
strs="AaaBbbCcccDde"
groups = groupby(strs)
print "result", [(label, sum(1 for i in group)) for label, group in groups]
# output: [('A', 1), ('a', 2), ('B', 1), ('b', 2), ('C', 1), ('c', 3), ('D', 1), ('d', 1), ('e', 1)]
Code: Alles auswählen
# M = [x for x in S]
Innerhalb der LC gibt es eine For-Schelife: for label, group in groups, dies entspricht aus dem Muster for x in S. Hier sehe ich, dass die groupby-Funktion zwei Werte zurückliefert, die einmal in die Variable label und einmal in die Variable group gespeichert werden.
Da die LC eine neue Liste erzeugt, wo dann die neuen Elemente gespeichert werden, braucht die LC vor der For-Schleife einen Ausdruck. Im Muster wäre hier das grüne x --> [x for x in S]. Im Schnipsel wäre die rote Markierung der Ausdruck in der LC --> [(label, sum(1 for i in group)) for label, group in groups]
Wenn ich einmal den Ausdruck extrahiere: (label, sum(1 for i in group))
Hier sehe ich, dass ein Tupel erzeugt wird. Dies erkenne ich an den äußeren runden Klammern. Und innerhalb des Tupels sehe ich, dass eine Generator Comprehension angewendet wird - und zwar hier --> sum(1 for i in group). Und in der Variable label innerhalb des Tupels werden die einzelnen Buchstaben gespeichert. Als Zwischenfazit sehe ich, dass in diesem Tupel als "Paare" an Daten gespeichert werden.
Nun habe ich diesen Schnipsel für mich zerlegt, und versuche das mal in Worten zusammezufassen:
In der LC wird gesagt: Iteriere mir über groups und speichere die Werte einmal in label und group. Erzeuge mir eine neue Liste, um Werte dort abzuspeichern, und greife daher auf den Ausdruck (label, sum(1 for i in group)) zu. In der neuen Liste sollen Tupels mit Daten-Paare gespeichert werden. Innerhalb des Tupel-Ausdruckes wird die Generator Comprehension angesprochen. Da der GC einen Iterator zurückgibt, und der Iterator somit eine sogenannte next-Methode besitzt, wird im GC immer eins hochgezählt (daher auch die Zahl 1) - solange bis der Iterator durchlaufen ist. Und das ganze wird dann summiert. Und in der Variable label werden die einzelnen Buchstaben gespeichert. Am Ende werden dann in der der neuen Liste Tupels gespeichert, die wiederum Daten-Paare enthalten. Hier werden also die Buchstaben gezählt, wie oft sie im String vorkamen.
Habe ich das richtig gedeutet? Bestimmt habe ich mal wieder daneben gegriffen.