2009-07-16 12 views
9

In Python habe ich eine Liste von Zeichenfolgen, von denen einige die leere Zeichenfolge sein können. Was ist der beste Weg, um die erste nicht leere Zeichenfolge zu erhalten?Erste nicht leere Zeichenfolge aus einer Liste in Python

+0

Möchten Sie den Verweis auf die erste leere Zeichenfolge oder möchten Sie alle leeren Zeichenfolgen aus einer Liste entfernen? Wurde diese Liste zufällig aus einer Split-Zeichenfolge generiert? –

+0

Aus Regex generiert: Übereinstimmungen = re.findall (r "foo (\ d +) | bar (\ d +)") - Ich möchte die erste nicht leere Zeichenfolge, wäre aber daran interessiert, alle leeren Zeichenfolgen zu entfernen (die Regex könnte länger werden). –

+0

Titel Ihrer Frage entsprechen nicht dem Körper Ihrer Frage. Repariere einen von ihnen. – SilentGhost

Antwort

18
next(s for s in list_of_string if s) 

Edit: py3k Beweis Version wie in den Kommentaren von Stephan202 beraten, danke.

+0

'[]' wird Listenverstehen genannt. – SilentGhost

+0

würde nicht funktionieren in py3k – SilentGhost

+2

py3k version: 'next (s für s in list_of_string if s)'. – Stephan202

5

Um alle leeren Saiten zu entfernen,

[s for s in list_of_strings if s]

Um die erste nicht leere Zeichenfolge zu erhalten, einfach diese Liste erstellen und das erste Element erhalten, oder die faule Methode verwenden, wie durch wuub vorgeschlagen.

+0

eine Zeile FTW! Ich liebe es. – Randolpho

+5

Ein bisschen ineffizient, obwohl! Wenn Sie eine Million nicht leerer Stiche nach nur einem leeren haben, werden Sie Zeit und Speicher darauf verwenden, eine Liste von einer Million Strings zu erzeugen, nur um den ersten zu bekommen ... Verwenden Sie zumindest einen Generator! – Mapio

3
def get_nonempty(list_of_strings): 
    for s in list_of_strings: 
     if s: 
      return s 
+1

Weit weniger elegent als das Generator-Verständnis oben vorgeschlagen, fügt auch mehr Komplexität der soruce-Datei. –

+1

Eleganz in den Augen des Betrachters, Daniel. Es funktioniert tadellos anders als die angenommene Antwortversion: das ist, was ausmacht – SilentGhost

0

um die erste, nicht leere Zeichenfolge in einer Liste zu erhalten, müssen Sie sie einfach durchlaufen und prüfen, ob sie nicht leer ist. das ist alles dazu.

arr = ['','',2,"one"] 
for i in arr: 
    if i: 
     print i 
     break 
2

Hier ist ein kurzer Weg:

filter(None, list_of_strings)[0] 

EDIT:

Hier ist ein etwas längerer Weg, der ist besser:

from itertools import ifilter 
ifilter(None, list_of_strings).next() 
+0

Warum ist der zweite Weg besser? –

+0

Dies funktioniert nur in Python 2.x und ist weniger effizient als das Generatorbeispiel, weil 'filter 'unabhängig vom Inhalt über die gesamte Liste iteriert. In py3k gibt 'filter' ein Filterobjekt zurück, das nicht abzählbar ist. – Stephan202

+0

@Fred: Der erste Weg wird durchlaufen und filtern Sie jede leere Zeichenfolge, erstellen Sie eine neue Liste und wählen Sie das erste Ergebnis. Der zweite Weg wird durch die Liste gehen, leere Strings herausfiltern, bis sie den ersten leeren findet und diesen zurückgibt. Es würde keine Zwischenliste erstellt. Wenn Sie beispielsweise eine Liste von 10.000 Strings haben und nur die erste leer ist, erstellt die erste Methode eine neue Liste von 9.999 Strings im Speicher, während die zweite nicht. –

0

Basierend auf Ihrer Frage Ich werde nehme viel an, aber um die erste nicht leere Zeichenfolge zu erhalten:

(i for i, s in enumerate(x) if s).next() 

, die ihren Index in der Liste zurückgibt. Die Bindung "x" zeigt auf Ihre String-Liste.

Verwandte Themen