2012-05-28 15 views
15

Tengo una duda sobre cómo usar la función de división.Función de división - evite el último espacio vacío

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

me dieron el resultado ['James', 'Joseph', 'Arun', '']

Necesito la salida como ['James', 'Joseph', 'Arun']

¿Cuál es la mejor manera de hacerlo?

+4

por favor no utilice 'str' como nombre de variable. Oculta el 'str' incorporado. –

+0

@ Mark Byers gracias por su comentario, mi nombre var real es diferente. – Jisson

Respuesta

23

Para eliminar todas las cadenas vacías se puede utilizar una lista por comprensión:

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

O el truco filtro/bool:

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

Tenga en cuenta que esto también eliminará las cadenas vacías en el inicio o en el centro de la lista, no solo al final.

Si lo que desea es eliminar la cadena vacía al final puede utilizar rstrip antes de separarse.

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

+1 No había escuchado sobre 'filer (bool, x)' hasta ahora, solo 'filter (None, x)'. ¿Cuál es mejor en tu opinión? – jamylak

+1

@jamylak: Ambos están bien. Prefiero 'filter (bool, x)' porque lo hace más obvio por qué funciona. Usar 'None' como función de filtrado parece mágico (a menos que haya leído la documentación para descubrir por qué funciona). Pero otros prefieren 'filter (None, x)' así que supongo que no hace mucha diferencia. –

16

Primero quite ; desde el borde derecho de la cadena:

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

También puede utilizar filter() (que filtrará fuera también elementos vacíos que no se encuentran al final de la cadena) . Pero lo anterior es realmente el enfoque más limpio en mi opinión, cuando desea evitar el elemento vacío al final, como resultado de los caracteres ";" que aparecen al final de la cadena.

EDITAR: En realidad más preciso que el anterior (en la que lo anterior es aún más preciso que el uso filter()) es el enfoque siguiente:

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

Esto eliminará sólo el último elemento, y sólo si se crearía vacío.

Pruebas de las tres soluciones se pueden ver, que dan resultados diferentes:

>>> 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

Simple y eficaz –

+2

IMO cambiarlo a 'rstrip' ya que dijo que el ** último ** espacio vacío. – jamylak

+1

@jamylak: correcto, he estado agregando esa información cuando escribía su comentario. Por favor vea la respuesta actualizada. – Tadeck

Cuestiones relacionadas