2016-06-09 36 views
0

ich eine Liste haben, die wie folgt aussieht:Entfernen Sublisten leerer Einträge aus einer Liste

some_list = [['a', 'b', 'c', 'd'], ['e', 'f', 'g', 'h'], ['', '', '', '']] 

Ich möchte alle leeren Teil-Listen innerhalb der Liste zu entfernen, so dass das Produkt einfach ist

clean_list = [['a', 'b', 'c', 'd'], ['e', 'f', 'g', 'h']] 

ich habe die folgenden versucht

for x in some_list: 
    if x == ['', '', '', '']: 
     some_list.remove(x) 

und

clean_list = filter(None, list) 

und

clean_list = [x for x in list if x] 

aber ich halte einen Ausgang mit Teil-Listen mit leeren Einträgen zu bekommen. Gedanken?

+0

Verwenden Sie 'list' nicht als Variable, die den eingebauten Typ maskiert. –

Antwort

3

Verwenden Sie die any() function-wählen Listen mit nicht-leere Werte:

clean_list = [sublist for sublist in some_list if any(sublist)] 

any() Kurzschluss; Iteratieren über die Werte in sublist wird es True zurückgeben, sobald es eine wahre (nicht leere) Zeichenfolge in dieser Unterliste findet und nach dem Testen aller Werte nur False zurückgibt und sie leer vorfindet.

Ihre x == ['', '', '', '']-Schleife ist fehlgeschlagen, weil Sie eine Liste geändert haben, während Sie darüber iteriert haben. Wenn die Liste kürzer wird, beginnt die Iteration, spätere Elemente zu überspringen, da sie Indizes verschoben haben, siehe strange result when removing item from a list für weitere Details.

Ihr filter(None, ..) Versuch schlägt fehl, weil ['', '', '', ''] selbst ist kein falscher Wert, ist es eine nicht-leere Liste gibt es 4 Saiten in ihm. Es spielt keine Rolle, dass diese Strings leer sind. Das gleiche gilt für Ihr Listenverständnis; Alle Listen in some_list sind nicht leer, daher werden alle als wahr betrachtet.

+0

Vielen Dank für die schöne Antwort, ich habe viel gelernt von was scheint so ein einfaches Problem. – Nick

+0

'filter (any, some_list)' –

Verwandte Themen