2009-07-16 4 views
9

In Python ho un elenco di stringhe, alcune delle quali potrebbero essere la stringa vuota. Qual è il modo migliore per ottenere la prima stringa non vuota?Ottieni la prima stringa non vuota da un elenco in python

+0

Si desidera il riferimento alla prima stringa vuota o si desidera rimuovere tutte le stringhe vuote da un elenco? Questa lista è stata generata da una stringa divisa per caso? –

+0

Generato da espressioni regolari: matches = re.findall (r "pippo (\ d +) | bar (\ d +)") - Voglio la prima stringa non vuota, ma sarei interessato a come rimuovere anche tutte le stringhe vuote (il regex potrebbe essere più lungo). –

+0

il titolo della tua domanda non corrisponde al corpo della tua domanda. Risolvi uno di loro. – SilentGhost

risposta

18
next(s for s in list_of_string if s) 

Modifica.

+0

'[]' è chiamato list comprehension. – SilentGhost

+0

non funzionerebbe nella versione py3k – SilentGhost

+2

py3k: 'next (s per s in list_of_string se s)'. – Stephan202

5

Per rimuovere tutte le stringhe vuote,

[s for s in list_of_strings if s]

Per ottenere la prima stringa non vuota, è sufficiente creare questa lista e ottenere il primo elemento, o utilizzare il metodo pigro come suggerito da wuub. Versione prova py3k come consigliato dal Stephan202 nei commenti, grazie:

+0

una riga FTW! Lo adoro. – Randolpho

+5

Un po 'inefficiente, però! Se hai un milione di punture non vuote dopo solo una vuota, passerai il tempo e la memoria a generare un elenco di un milione di corde, solo per ottenere il primo ... Almeno, usa un generatore! – Mapio

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

Molto meno elegante della comprensione del Generatore suggerita sopra, aggiunge anche più complessità al file soruce. –

+1

eleganza negli occhi di chi guarda, Daniel. Funziona perfettamente a differenza della versione della risposta accettata: questo è ciò che conta – SilentGhost

0

per ottenere la prima stringa non vuota in una lista, basta passarla sopra e controllare se non è vuota. questo è tutto ciò che c'è da fare.

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

Ecco un breve tratto:

filter(None, list_of_strings)[0] 

EDIT:

Ecco un po 'più lungo modo che è meglio:

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

Perché il secondo modo è migliore? –

+0

Funziona solo in Python 2.x, ed è meno efficiente rispetto all'esempio generatore, perché 'filter' scorre su tutta la lista, indipendentemente dal contenuto. In py3k 'filter' restituisce un oggetto filtro, che è unsubscriptable. – Stephan202

+0

@Fred: Il primo modo passerà e filtrerà ogni stringa vuota, creerà un nuovo elenco e selezionerà il primo risultato. Il secondo modo passerà attraverso l'elenco filtrando le stringhe vuote fino a trovare il primo vuoto e lo restituirà. Non verrà creata alcuna lista intermedia. Ad esempio, se si dispone di un elenco di 10.000 stringhe e solo il primo è vuoto, il primo metodo crea un nuovo elenco di 9.999 stringhe in memoria mentre il secondo no. –

0

In base alla tua domanda dovrò assumere molto, ma per "ottenere" la prima stringa non vuota:

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

che restituisce il suo indice nell'elenco. Il legame 'x' punta al tuo elenco di stringhe.

Problemi correlati