Gibt es eine bessere Lösung, um die Elemente einer Liste in Untergruppen von zunehmender Größe zu gruppieren?
Beispiele:
%Vor%BEARBEITEN
Hier sind die Ergebnisse von timeit
:
Verwenden eines Generatorausdrucks:
%Vor%Demo:
%Vor%Dies ist ein Generator, der mit jedem iterablen Programm arbeitet, einschließlich endloser Iterables:
%Vor% Sie könnten einen One-Liner mit ein wenig Betrug machen, um den iter()
-Aufruf auf Ihrem Listenobjekt zu "inline" zu machen:
Ich bin nicht wirklich ganz klar, warum Sie das tun wollen, was ich nur erwähne, weil es wahrscheinlich eine aufgabenspezifische Art gibt, Ihre Frage zu beantworten, aber ich würde behaupten, dass das Folgende zumindest klarer ist:
%Vor% An diesem Punkt können Sie es über list(increasing_groups(some_list))
bekommen.
Sie können die Anzahl der zu schneidenden Elemente mit itertools.count
verfolgen und die Elemente mit itertools.islice
auswählen.
Das Wichtigste ist
%Vor%Diese Zeile stellt sicher, dass das letzte Element in der Liste nur dann bleibt, wenn seine Länge größer als die vorletzte ist.
Der Schlüssel hier ist, dass StopIteration
Ausnahme von next(it)
auch die while
Schleife unterbricht. Das bedeutet, dass du die letzten Elems verlieren kannst, die nicht in eine Gruppe passen.
Mit itertools
kann es noch kompakter gemacht werden. Überprüfen Sie Martijn Pieters 'Antwort.
Ja, es gibt eine einfache Antwort.
%Vor%Weil die Größe jedes Slices eine arithmetische Sequenz ist. Und die Gleichung, um die Gesamtanzahl der arithmetischen Sequenz zu berechnen, ist bekannt. Also könnten wir einfach den Anfangs- und Endindex jedes Slices direkt mit dieser Gleichung berechnen.
Dies
%Vor%Gibt Ihnen nach Gauss die Anfangs- und Endindizes des n-ten Elements Ihrer neuen Liste.
Deshalb
%Vor%Ist das n-te Element der Liste und mit einer etwas stumpfen Filterung:
%Vor% Eine richtige Schleife mit einem tatsächlichen break
wäre wahrscheinlich besser, obwohl
Nun, da ich weiß, wie StopIteration
von list
abgefangen wird (Danke Martjin), kann eine einfache Closing-Bedingung mit folgendem Befehl gemacht werden:
Vorausgesetzt, dass -1
niedriger ist als jeder Artikel in Ihrer Liste. (Und die Floor-Divisionen sind für Integer-Typisierung in Python 3.)
Tags und Links python list python-3.x