Notieren Sie sich die prägnante Beschreibungsmethode zum Zusammenfassen der monoton ansteigenden Zahlenfolge für jeden aufeinanderfolgenden Wert.
import itertools
sample = [1,2,3,5,6,7,9,10]
[list(g) for _, g in itertools.groupby(
sample, key=lambda n, c=itertools.count(): n - next(c))]
# => [[1, 2, 3], [5, 6, 7], [9, 10]]
itertools.groupby
übergibt jedes Element der Iterable des ersten Arguments an das zweite Argument und gibt es zurück. Gibt einen Iterator zurück, der aufeinanderfolgende Elemente mit demselben Wert zusammen mit den an die zweite Argumentfunktion übergebenen Elementen zurückgibt.
Im obigen Beispiel ist das erste Argument "sample" und das zweite Argument "key" ein Lambda-Ausdruck.
Der Lambda-Ausdruck hat zwei Argumente, "n" und optional "c", aber "c" hat den Standardwert "itertools.count ()", der in "groupby" fortlaufend ist. Beim Aufruf bei der Bestimmung der Identität der zu verwendenden Elemente wird jedes Element von "sample" an "n" übergeben. itertools.count ()
generiert einen Iterator, der eine Zahl zurückgibt, die von 0
um 1
erhöht wird. Der Standardwert von "c" wird nur einmal ausgeführt, wenn der Lambda-Ausdruck definiert ist, und ein Iterator, der die Zahl "+ 1" in der Reihenfolge von 0 zurückgibt, wird zugewiesen. Für "n --next (c)" erhöht sich "next (c)" mit jedem Aufruf um "1", so dass "n" um "1" zunimmt und der gleiche Wert aus diesem Lambda-Ausdruck erhalten wird. Es wird zurückgegeben, aber ein anderer Wert wird zurückgegeben, wenn n
mehr als 1
erhöht. Der Iterator, der aufeinanderfolgende Elemente mit demselben Rückgabewert dieses Lambda-Ausdrucks zurückgibt, ist "g", und "list (g)" generiert eine Liste aufeinanderfolgender Elemente in einer verschachtelten Liste nach Listeneinschlussnotation.
Recommended Posts