Repeating Elemente in der Liste Python

7

Sagen wir, ich habe eine Liste von Strings:

%Vor%

Ich möchte eine Liste mit Elementen erstellen, die mindestens zweimal nacheinander angezeigt werden:

%Vor%

Ich weiß, dass ich eine for-Schleife verwenden muss, aber ich kann nicht herausfinden, wie ich die Elemente in einer Reihe anzielen soll. Wie kann ich das tun?

BEARBEITEN: Was passiert, wenn das gleiche Element zweimal in einem wiederholt wird? Dann wäre die eingestellte Funktion unwirksam.

%Vor%     
Albert 22.10.2012, 22:12
quelle

9 Antworten

6

Probieren Sie itertools.groupby() hier aus:

%Vor%

mit islice() :

%Vor%

mit zip() und izip() :

%Vor%

timeit Ergebnisse:

%Vor%

Ausgabe:

%Vor%

Fazit:

Pokes Lösung ist die schnellste Lösung im Vergleich zu anderen Alternativen.

    
Ashwini Chaudhary 22.10.2012, 22:13
quelle
5

Das klingt nach Hausaufgaben, also skizziere ich nur, was ich tun würde:

  1. Iterate über a , behalte aber den Index jedes Elements in einer Variablen. enumerate() wird nützlich sein.
  2. Starten Sie innerhalb Ihrer for -Schleife eine while -Schleife aus dem Index des aktuellen Elements.
  3. Wiederholen Sie die Schleife, solange das nächste Element dasselbe wie das vorherige (oder das Original) ist. break wird hier nützlich sein.
  4. Zählen Sie die Anzahl der Wiederholungen der Schleife (Sie benötigen dafür eine Zählervariable).
  5. Hängen Sie das Element an Ihre result an, wenn Ihre Counter-Variable >= 2 ist.
Blender 22.10.2012 22:13
quelle
3

Mein Take:

%Vor%     
poke 22.10.2012 22:20
quelle
3

Wie wäre es mit:

set([a[i] for i in range(1, len(a)) if a[i] == a[i-1]])

    
D Read 22.10.2012 23:12
quelle
2

Hier ist ein Python-One-Liner, der tun wird, was ich denke, dass Sie wollen. Es verwendet das Paket itertools :

%Vor%     
Will 22.10.2012 22:39
quelle
1

Die bearbeitete Frage fordert, das set () zu vermeiden und die meisten Antworten auszuschließen.

Ich dachte, ich würde die eingängigen Listen mit der guten alten Schleife von @poke vergleichen und eine andere, die ich erstellt habe:

%Vor%

Gibt mir Ergebnisse:

%Vor%

Eine einfache Schleife scheint also schneller zu sein als alle Listen-Comprehensions und doppelt so schnell wie die Groupby. Die grundlegenden Schleifen sind jedoch komplizierter zu lesen und zu schreiben, also würde ich wahrscheinlich in den meisten Fällen bei der groupby () bleiben.

    
D Read 23.10.2012 13:39
quelle
0

Hier ist ein Regex-Einzeiler:

%Vor%

Tut mir leid, zu faul, um es zu tun.

    
verbsintransit 23.10.2012 19:25
quelle
0
%Vor%     
raton 27.10.2012 03:25
quelle
0

Mit enumerate nach zwei hintereinander suchen:

%Vor%     
Brownbat 11.08.2013 19:36
quelle

Tags und Links