Eliminar la nueva línea final de los elementos de una lista de cadenas

122

Tengo que tomar una gran lista de palabras en el formulario:

['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']

y luego usando la función de tira, conviértalo en:

['this', 'is', 'a', 'list', 'of', 'words']

Pensé que lo que había escrito funcionaría, pero sigo recibiendo un error que dice:

"el objeto 'list' no tiene el atributo 'strip'"

Aquí está el código que probé:

strip_list = []
for lengths in range(1,20):
    strip_list.append(0) #longest word in the text file is 20 characters long
for a in lines:
    strip_list.append(lines[a].strip())
George Burrows
fuente
1
Explique por qué agrega de 0 a strip_list19 veces y luego agrega las líneas despojadas. Ese código huele muy mal. Además, si obtuviste esas cosas de un archivo, deberías eliminarlas en el camino: construir una lista grande y luego convertirla en otra lista grande no es una buena idea. También 2, su código no debe depender de conocer la longitud de la palabra / línea más larga. Retrocede un poco: ¿qué estás tratando de lograr? ¿Con qué vas a hacer strip_list?
John Machin

Respuestas:

211
>>> my_list = ['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']
>>> map(str.strip, my_list)
['this', 'is', 'a', 'list', 'of', 'words']
Sven Marnach
fuente
¿podría simplemente decir stripped_list = map (str.strip, my_list) y luego imprimir stripped_list para imprimir esta nueva lista?
George Burrows, el
19
Si está utilizando Python 2, tenga en cuenta que eso str.stripsolo funciona si está seguro de que la lista no contiene cadenas unicode. Si puede contener cadenas de 8 bits y unicode, use lambda s: s.strip()como se mencionó anteriormente o use la stripfunción que puede importar desde el stringsmódulo.
Cito
El comentario de Cito es en realidad el que merece más reputación. Las listas de mapas y comprensión no son equivalentes en OOP, porque somos métodos passe, no funciones.
e-satis
construido en la función de mapa en el samaritano
SIslam
39
Tenga en cuenta lo siguiente: si está utilizando Python 3.xy desea devolver una lista, debe hacerlo list, para que así sea list(map(str.strip, my_list)). También verifique eso: enlace .
Entonces S
118

lista de comprensión? [x.strip() for x in lst]

yosukesabai
fuente
64

Puedes usar listas de comprensión :

strip_list = [item.strip() for item in lines]

O la mapfunción:

# with a lambda
strip_list = map(lambda it: it.strip(), lines)

# without a lambda
strip_list = map(str.strip, lines)
Schnouki
fuente
3
La lambda en la segunda versión es exagerada.
gddc
1
También puede usar el mismo enfoque para hacer lo que sea con los 0valores al principio de la lista. Aunque realmente no puedo imaginar qué es lo que estás tratando de lograr al ponerlos en la misma lista de resultados ...
Karl Knechtel
44
En Python 3, la tercera forma "sin una lambda" debe ser strip_list = list(map(str.strip, lines))como map () devuelve un iterador de mapa. docs.python.org/3/library/functions.html#map
Devy
7

Esto se puede hacer usando listas de comprensión como se define en PEP 202

[w.strip() for w in  ['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']]
Casey
fuente
Estaba pensando en cambiar el nombre de lista map:)
Casey
3

Todas las otras respuestas, y principalmente sobre la comprensión de la lista, son geniales. Pero solo para explicar su error:

strip_list = []
for lengths in range(1,20):
    strip_list.append(0) #longest word in the text file is 20 characters long
for a in lines:
    strip_list.append(lines[a].strip())

aes un miembro de su lista, no un índice. Lo que podrías escribir es esto:

[...]
for a in lines:
    strip_list.append(a.strip())

Otro comentario importante: puede crear una lista vacía de esta manera:

strip_list = [0] * 20

Pero esto no es tan útil, ya que .append agrega cosas a su lista. En su caso, no es útil crear una lista con valores predeterminados, ya que lo creará elemento por elemento al agregar cadenas despojadas.

Entonces su código debería ser como:

strip_list = []
for a in lines:
    strip_list.append(a.strip())

Pero, seguro, el mejor es este, ya que es exactamente lo mismo:

stripped = [line.strip() for line in lines]

En caso de que tenga algo más complicado que solo un .strip, ponga esto en una función y haga lo mismo. Esa es la forma más fácil de trabajar con listas.

Joël
fuente
2

Si necesita eliminar solo los espacios en blanco al final , puede usar str.rstrip(), que debería ser un poco más eficiente que str.strip():

>>> lst = ['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']
>>> [x.rstrip() for x in lst]
['this', 'is', 'a', 'list', 'of', 'words']
>>> list(map(str.rstrip, lst))
['this', 'is', 'a', 'list', 'of', 'words']
Eugene Yarmash
fuente
-1
my_list = ['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']
print([l.strip() for l in my_list])

Salida:

['this', 'is', 'a', 'list', 'of', 'words']
Vignesh Kini K
fuente
igual que otras respuestas anteriores
Jean-François Fabre