2012-05-28 15 views
15

Ho un dubbio su come utilizzare la funzione split.Funzione split - evita l'ultimo spazio vuoto

str = 'James;Joseph;Arun;' 
str.split(';') 

ho ottenuto il risultato ['James', 'Joseph', 'Arun', '']

ho bisogno l'uscita come ['James', 'Joseph', 'Arun']

Qual è il modo migliore per farlo?

+4

prega di non utilizzare 'str' come un nome di variabile. Nasconde il 'str' incorporato. –

+0

@ Mark Byers ti ringrazio per il tuo commento, il mio vero nome var è diverso. – Jisson

risposta

23

Per rimuovere tutte le stringhe vuote è possibile utilizzare una lista di comprensione:

>>> [x for x in my_str.split(';') if x] 

O il trucco del filtro/bool:

>>> filter(bool, my_str.split(';')) 

Si noti che questo sarà anche rimuovere stringhe vuote in partenza o in al centro della lista, non solo alla fine.

Se si desidera solo per rimuovere la stringa vuota alla fine è possibile utilizzare rstrip prima di sciogliersi.

>>> my_str.rstrip(';').split(';') 
+3

+1 Non avevo sentito parlare di 'filer (bool, x)' fino ad ora, solo 'filter (None, x)'. Quale è meglio secondo te? – jamylak

+1

@jamylak: entrambi vanno bene. Preferisco 'filter (bool, x)' perché rende più ovvio il motivo per cui funziona. L'utilizzo di 'None' come funzione di filtraggio sembra magico (a meno che tu non abbia letto la documentazione per scoprire perché funziona). Ma altri preferiscono 'filter (None, x)' quindi immagino che non faccia molta differenza. –

16

Prima rimuovere ; dal bordo destro della stringa:

s.rstrip(';').split(';') 

È possibile anche utilizzare filter() (che filtrerà fuori anche elementi vuoti non trovati alla fine della stringa) . Ma quanto sopra è l'approccio più pulito a mio avviso, quando si desidera evitare elementi vuoti alla fine, risultanti dai caratteri ";" che si verificano alla fine della stringa.

EDIT: In realtà più accurata rispetto alla suddetta (dove quanto sopra è ancora più preciso rispetto all'utilizzo filter()) è il seguente approccio:

(s[:-1] if s.endswith(';') else s).split(';') 

Questo rimuove solo l'ultimo elemento, e solo se sarebbe creato vuoto.

prova tutte e tre le soluzioni si vedrà, che danno risultati diversi:

>>> def test_solution(solution): 
    cases = [ 
     'James;Joseph;Arun;', 
     'James;;Arun', 
     'James;Joseph;Arun', 
     ';James;Joseph;Arun', 
     'James;Joseph;;;', 
     ';;;', 
     ] 
    for case in cases: 
     print '%r => %r' % (case, solution(case)) 

>>> test_solution(lambda s: s.split(';')) # original solution 
'James;Joseph;Arun;' => ['James', 'Joseph', 'Arun', ''] 
'James;;Arun' => ['James', '', 'Arun'] 
'James;Joseph;Arun' => ['James', 'Joseph', 'Arun'] 
';James;Joseph;Arun' => ['', 'James', 'Joseph', 'Arun'] 
'James;Joseph;;;' => ['James', 'Joseph', '', '', ''] 
';;;' => ['', '', '', ''] 
>>> test_solution(lambda s: filter(bool, s.split(';'))) 
'James;Joseph;Arun;' => ['James', 'Joseph', 'Arun'] 
'James;;Arun' => ['James', 'Arun'] 
'James;Joseph;Arun' => ['James', 'Joseph', 'Arun'] 
';James;Joseph;Arun' => ['James', 'Joseph', 'Arun'] 
'James;Joseph;;;' => ['James', 'Joseph'] 
';;;' => [] 
>>> test_solution(lambda s: s.rstrip(';').split(';')) 
'James;Joseph;Arun;' => ['James', 'Joseph', 'Arun'] 
'James;;Arun' => ['James', '', 'Arun'] 
'James;Joseph;Arun' => ['James', 'Joseph', 'Arun'] 
';James;Joseph;Arun' => ['', 'James', 'Joseph', 'Arun'] 
'James;Joseph;;;' => ['James', 'Joseph'] 
';;;' => [''] 
>>> test_solution(lambda s: (s[:-1] if s.endswith(';') else s).split(';')) 
'James;Joseph;Arun;' => ['James', 'Joseph', 'Arun'] 
'James;;Arun' => ['James', '', 'Arun'] 
'James;Joseph;Arun' => ['James', 'Joseph', 'Arun'] 
';James;Joseph;Arun' => ['', 'James', 'Joseph', 'Arun'] 
'James;Joseph;;;' => ['James', 'Joseph', '', ''] 
';;;' => ['', '', ''] 
+0

Semplice ed efficace –

+2

IMO cambialo in 'rstrip' da quando ha detto l'ultimo ** spazio vuoto. – jamylak

+1

@jamylak: corretto, ho aggiunto queste informazioni mentre stavi scrivendo il tuo commento. Si prega di consultare la risposta aggiornata. – Tadeck