Identifizieren Sie Gruppen verschiedener fortlaufender Nummern in einer Liste

8

In diesem anderen SO-Post , einem Python-Benutzer gefragt, wie man fortlaufende Zahlen so gruppiert, dass irgendwelche Sequenzen einfach durch sein Start / Ende dargestellt werden könnten und irgendwelche Nachzügler als einzelne Elemente angezeigt würden. Die angenommene Antwort funktioniert hervorragend für kontinuierliche Sequenzen.

Ich muss in der Lage sein, eine ähnliche Lösung anzupassen, aber für eine Sequenz von Zahlen, die potenziell (nicht immer) unterschiedliche Inkremente haben. Idealerweise wird das, was ich repräsentiere, auch das Inkrement einschließen (damit sie wissen, ob es alle 3, 4, 5, n-ten war).

Als Referenz auf die ursprüngliche Frage hat der Benutzer folgende Eingabe / Ausgabe angefordert:

%Vor%

Was ich möchte, ist das folgende (Anmerkung: Ich habe ein Tupel als Ausgabe geschrieben, um Klarheit zu schaffen, aber xrange würde mit seiner Schrittvariablen bevorzugt):

%Vor%

Und es könnte auch die folgenden Eingaben verarbeiten

%Vor%

Ich weiß, dass xrange() einen Schritt unterstützt, so dass es möglich ist, sogar eine Variante der Antwort des anderen Benutzers zu verwenden. Ich habe versucht, einige Änderungen basierend auf dem, was sie in der Erklärung geschrieben haben, zu machen, aber ich konnte das Ergebnis, das ich suchte, nicht erreichen.

Für alle, die nicht auf den ursprünglichen Link klicken möchten, der Code, der ursprünglich von Nadia Alramli ist:

%Vor%     
ColinKennedy 26.09.2016, 18:13
quelle

3 Antworten

2

Sie können einen Iterator erstellen, um die Gruppierung zu vereinfachen und zu versuchen, das nächste Element aus der folgenden Gruppe zu ziehen, die das Ende der vorherigen Gruppe sein wird:

%Vor%

welche Ihnen geben:

%Vor%

Wenn der Schritt 1 ist, ist er nicht in der xrange-Ausgabe enthalten.

    
Padraic Cunningham 26.09.2016, 21:12
quelle
4

Das itertools paarweise Rezept ist eine Möglichkeit, das Problem zu lösen. Mit itertools.groupby können Gruppen von Paaren erstellt werden, deren mathematische Differenz äquivalent ist. Die ersten und letzten Elemente jeder Gruppe werden dann für Gruppen mit mehreren Elementen ausgewählt, oder das letzte Element wird für Singleton-Gruppen ausgewählt:

%Vor%

Testversion: input -> grouper(lst) -> output

%Vor%

Aktualisieren : ( Patch für doppelte Start- und / oder Endwerte )

%Vor%     
Moses Koledoye 26.09.2016 20:47
quelle
2

Hier ist eine schnell geschriebene (und extrem hässliche) Antwort:

%Vor%

Dies gibt [(2, 8, 2), (12, 17, 1), 20]

zurück

Langsam, da eine Liste kopiert und Elemente daraus entfernt werden

Es findet nur vollständige Progressionen und nur in sortierten Arrays.

Kurz gesagt, es ist beschissen, aber sollte funktionieren;)

Es gibt andere (kühlere, mehr pythische) Wege, dies zu tun, zum Beispiel könnten Sie Ihre Liste in eine Menge umwandeln, zwei Elemente entfernen, ihre arithmetische Progression berechnen und sich mit der Menge schneiden.

Sie können die Antwort, die Sie zur Verfügung gestellt haben, auch erneut verwenden, um nach bestimmten Schrittgrößen zu suchen. z.B.:

%Vor%

Welche findet jede Gruppe mit Schrittweite von 2 , sondern nur diese.

    
JeD 26.09.2016 18:43
quelle

Tags und Links