2017-02-18 3 views
3

Wenn ich eine Python-Liste:Python entfernen Listenelemente

text = ["the", "red", "", "", "fox", "", "is"] 

Wie kann ich itertools (oder eine andere Art und Weise), um die Textliste zu ändern, damit es elem und elem+1 prüft und wenn es gleich zu "" findet , dann entfernt es sie von der Liste. Ich möchte nur die Liste geändert, wenn elem + elemt1 gefunden werden (so bleibt der ["fox" "", "is"] Teil in der Liste). Die Reihenfolge der Listenelemente muss intakt bleiben.

text = ["the", "red", "fox", "", "is"] 
+0

so wollen Sie NULL-Werte mit „“ aus dem entfernen, Liste? –

+2

Was ist mit '[" the "," red "," "," "," "," fox "," "," ist "]? Sollten alle drei leeren Saiten entfernt werden oder du einen von ihnen behalten? – Psidom

Antwort

2
from itertools import groupby, chain 

print list(chain(*[ 
    l for l in [list(it) for _, it in groupby(text)] if l[:2] != ['', ''] 
])) 

Ergebnis:

['the', 'red', 'fox', '', 'is'] 

Mit groupby können wir gleiche aufeinanderfolgende Elemente wie Listen. Dann prüfen wir für jede Liste, ob die Länge größer als zwei ist und alle Elemente die leere Zeichenfolge sind. Dann behalten wir, was wir wollen und wir plätten die Listen mit chain.

+0

Verwenden Sie 'zip_longest' – Daniel

+0

Dieses Ergebnis sieht nicht wie das gewünschte Ergebnis in der Frage aus. – schwobaseggl

+0

Sie haben Recht. Ich habe meine Antwort aktualisiert – JuniorCompressor

-3
for t in text: 
    if not t: 
    text.remove(t) 
+1

ändern Sie niemals eine Liste, über die Sie iterieren. – Daniel

2

können Sie itertools.groupby verwenden:

import itertools 

new = [] 
for item, group in itertools.groupby(text): 
    group = list(group) 
    if item != '' or len(group) == 1: 
     new.extend(group) 

>>> new 
['the', 'red', 'fox', '', 'is'] 

Oder ein bisschen effizienter mit groupby -function. Man kann die Tatsache nutzen, dass leere Zeichenfolgen betrachtet werden False wenn gieße bool:

import itertools 

new = [] 
for item, group in itertools.groupby(text, bool): 
    group = list(group) 
    if item or len(group) == 1: 
     new.extend(group) 

>>> new 
['the', 'red', 'fox', '', 'is'] 
+0

Dies ist die gleiche Logik wie meine Lösung, aber viel besser lesbar und damit lehrreich;) – schwobaseggl

0

es ist Arbeit mit mehr als 2 weißen Räumen auch

text = ["the", "red", "","", "", "fox", "", "is"] 
new_text = [] 

text_len = len(text); 
print(text_len) 
i = 0; 
while(i < text_len): 
    if (text[i] == "" and text[i + 1] == ""): 
     i += 1; 
     while(True): 
       if (text[i] == "" and text[i + 1] == ""): 
        i+=1; 
       else: 
         break; 

    else : 
     new_text.append(text[i]); 
    i += 1; 
print(new_text) 
Verwandte Themen