¿Cómo dividir por comas y eliminar espacios en blanco en Python?

Resuelto Mr_Chimp asked hace 14 años • 10 respuestas

Tengo un código Python que se divide en comas, pero no elimina los espacios en blanco:

>>> string = "blah, lots  ,  of ,  spaces, here "
>>> mylist = string.split(',')
>>> print mylist
['blah', ' lots  ', '  of ', '  spaces', ' here ']

Preferiría terminar con los espacios en blanco eliminados de esta manera:

['blah', 'lots', 'of', 'spaces', 'here']

Soy consciente de que podría recorrer la lista y eliminar() cada elemento pero, como se trata de Python, supongo que hay una forma más rápida, fácil y elegante de hacerlo.

Mr_Chimp avatar Nov 02 '10 00:11 Mr_Chimp
Aceptado

Utilice la comprensión de listas: es más simple y tan fácil de leer como un forbucle.

my_string = "blah, lots  ,  of ,  spaces, here "
result = [x.strip() for x in my_string.split(',')]
# result is ["blah", "lots", "of", "spaces", "here"]

Consulte: Documentos de Python sobre comprensión de listas.
Una buena explicación de 2 segundos sobre comprensión de listas.

Sean Vieira avatar Nov 01 '2010 17:11 Sean Vieira

Llegué a agregar:

map(str.strip, string.split(','))

pero vi que Jason Orendorff ya lo había mencionado en un comentario .

Al leer el comentario de Glenn Maynard sobre la misma respuesta que sugiere listas por comprensión sobre el mapa, comencé a preguntarme por qué. Supuse que se refería a razones de rendimiento, pero, por supuesto, podría haberlo hecho por razones estilísticas o algo más (¿Glenn?).

Entonces, una prueba rápida (¿posiblemente defectuosa?) en mi caja (Python 2.6.5 en Ubuntu 10.04) aplicando los tres métodos en un bucle reveló:

$ time ./list_comprehension.py  # [word.strip() for word in string.split(',')]
real    0m22.876s

$ time ./map_with_lambda.py     # map(lambda s: s.strip(), string.split(','))
real    0m25.736s

$ time ./map_with_str.strip.py  # map(str.strip, string.split(','))
real    0m19.428s

siendo map(str.strip, string.split(','))el ganador, aunque parece que todos están en el mismo estadio.

Ciertamente, el mapa (con o sin lambda) no necesariamente debe descartarse por razones de rendimiento, y para mí es al menos tan claro como una lista de comprensión.

Sean avatar Feb 28 '2013 14:02 Sean

Dividir usando una expresión regular. Tenga en cuenta que hice el caso más general con espacios iniciales. La comprensión de la lista consiste en eliminar las cadenas nulas al principio y al final.

>>> import re
>>> string = "  blah, lots  ,  of ,  spaces, here "
>>> pattern = re.compile("^\s+|\s*,\s*|\s+$")
>>> print([x for x in pattern.split(string) if x])
['blah', 'lots', 'of', 'spaces', 'here']

Esto funciona incluso si ^\s+no coincide:

>>> string = "foo,   bar  "
>>> print([x for x in pattern.split(string) if x])
['foo', 'bar']
>>>

He aquí por qué necesita ^\s+:

>>> pattern = re.compile("\s*,\s*|\s+$")
>>> print([x for x in pattern.split(string) if x])
['  blah', 'lots', 'of', 'spaces', 'here']

¿Ves los espacios principales en bla?

Aclaración: lo anterior usa el intérprete de Python 3, pero los resultados son los mismos en Python 2.

tbc0 avatar Oct 06 '2012 13:10 tbc0

Simplemente elimine el espacio en blanco de la cadena antes de dividirla.

mylist = my_string.replace(' ','').split(',')
user489041 avatar Nov 01 '2010 18:11 user489041