¿Cómo dividir por comas y eliminar espacios en blanco en Python?
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.
Utilice la comprensión de listas: es más simple y tan fácil de leer como un for
bucle.
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.
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.
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.
Simplemente elimine el espacio en blanco de la cadena antes de dividirla.
mylist = my_string.replace(' ','').split(',')