2017-06-01 1 views
1

EingangListe Verständnis in Python if/else

['27', ' 5', '6', ' 0', ' 0', '', '', '', '','','','','','34','32','','','',''] 

Ich möchte meine Ausgabe, so etwas sein. Die Logik besteht darin, 4 aufeinanderfolgende doppelte leere Zeichenfolgen '' durch einzelne neue Elemente zu ersetzen, während der Rest der Elemente beibehalten wird.

['27', ' 5', '6', ' 0', ' 0', 'LOL','LOL', '34','32','LOL'] 

Ich bin verwirrt, warum dies gibt nur die Ausgabe als

['LOL','LOL','LOL'] 

Mein Code ist wie folgt:

from itertools import groupby,repeat 
L = ['27', ' 5', '6', ' 0', ' 0', '', '', '', '','','','','','34','32','','','',''] 
grouped_L = [(k, len(list(g))) for k,g in groupby(L)] 

final_list = [z if x=='' else x for x,y in grouped_L for z in repeat('LOL',(y//4)) ] 
print(final_list) 
+1

Was ist die Logik hinter der erwarteten Ausgabe? Ihr Code schlägt fehl, weil 'repeat (..., (y // 4))' zu * zero * Wiederholungen für jedes 'y <4 'führt, so dass der linke Ausdruck überhaupt nicht ausgeführt wird (eine Schleife) über null Elemente erzeugt keine Iterationen). –

+0

Wohin verschwanden die "34" und "32"? Und warum erzeugt das aufeinanderfolgende "0", "0" kein "LOL"? – poke

+0

Mein böser Mann. Ich habe vergessen, sie zu bearbeiten. Es tut uns leid!! – void

Antwort

2

Ihre innerste Schleife erzeugt keine Ergebnisse für jede y < 4:

>>> from itertools import repeat 
>>> y = 4 
>>> list(repeat('LOL', y // 4)) 
['LOL'] 
>>> y = 3 
>>> list(repeat('LOL', y // 4)) 
[] 

Mit Nein Iterationen wird der resultierenden Liste nichts hinzugefügt.

Sie müssen eine andere Strategie verwenden; Sie LOL für Gruppen mit einer Länge y von 4 und höher, und für alles andere verwenden Sie das Original enthalten müssen, und immer wiederholen:

[value 
for x, y in grouped_L 
for value in repeat(x if y < 4 else 'LOL', y if y < 4 else y // 4)] 

So die oben entweder x * y für y < 4 enthält, sonst ist es‘ ll anderes 'LOL' * (y // 4) für alles enthalten:

>>> [value 
... for x, y in grouped_L 
... for value in repeat(x if y < 4 else 'LOL', y if y < 4 else y // 4)] 
['27', ' 5', '6', ' 0', ' 0', 'LOL', '34', '32', 'LOL'] 
+0

Das ist genau das, was ich brauchte. Danke :) – void

1

Ohne Listenkomprehensionen aber IMHO ist es eine viel einfachere Lösung.

a = ['27', ' 5', '6', ' 0', ' 0', 'LOL', '34','32','LOL'] 

def remove_duplicates(w_duplicates): 
    wo_duplicates = [] 
    for el in w_duplicates: 
     if wo_duplicates and el == wo_duplicates[-1]: 
      continue 
     wo_duplicates.append(el) 
    return wo_duplicates 

print remove_duplicates(a) 
+0

Schön, dass ich die Lösung ohne Listenverständnis gefunden habe. Aber das Listenverstehen ist das, wonach ich gesucht habe. – void