Python Gruppierungselemente in einer Liste in zunehmender Größe

7
%Vor%

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 :

%Vor%     
Scorpion_God 11.04.2014, 14:28
quelle

6 Antworten

13

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:

%Vor%     
Martijn Pieters 11.04.2014, 14:36
quelle
1

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.

    
Benjamin Pollack 11.04.2014 14:33
quelle
1

Sie können die Anzahl der zu schneidenden Elemente mit itertools.count verfolgen und die Elemente mit itertools.islice auswählen.

%Vor%

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.

    
thefourtheye 11.04.2014 14:46
quelle
1
%Vor%

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.

%Vor%

Mit itertools kann es noch kompakter gemacht werden. Überprüfen Sie Martijn Pieters 'Antwort.

    
SzieberthAdam 11.04.2014 14:50
quelle
1

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.

    
Sheng 11.04.2014 14:36
quelle
1

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

Bearbeiten

Nun, da ich weiß, wie StopIteration von list abgefangen wird (Danke Martjin), kann eine einfache Closing-Bedingung mit folgendem Befehl gemacht werden:

%Vor%

Vorausgesetzt, dass -1 niedriger ist als jeder Artikel in Ihrer Liste. (Und die Floor-Divisionen sind für Integer-Typisierung in Python 3.)

    
njzk2 11.04.2014 14:51
quelle

Tags und Links