2011-11-02 30 views
68

tengo que tomar una gran lista de palabras en la forma:Strip todos los elementos de una lista de cadenas

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

y luego usando la función de tira, lo convierten en:

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

I pensaba que lo que había escrito funcionaría, pero aparece un error que dice:

"'list' object has no attribute 'strip'"

Este es el código que he intentado:

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()) 
+1

Explica por qué agregas 0 a 'strip_list' 19 veces y luego anexas tus líneas peladas. Ese código tiene un olor muy malo al respecto. Además, si obtuviste esas cosas de un archivo, deberías quitártelas en el camino hacia la creación de una lista grande y luego incluirla en otra lista grande no es una buena idea. También 2, su código no debería depender de saber la longitud de la palabra/línea más larga. Retrocede un poco: ¿qué estás tratando de lograr? ¿Qué vas a hacer con 'strip_list'? –

+0

Relacionados [¿Cómo eliminar \ n de un elemento de la lista?] (Http: // stackoverflow.com/q/3849509) –

Respuesta

128
>>> 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'] 
+0

¿podría simplemente decir stripped_list = map (str.strip, my_list) y luego imprimir stripped_list para imprimir esta nueva lista? –

+0

@GeorgeBurrows Sí. – agf

+16

Si está utilizando Python 2, tenga en cuenta que 'str.strip' solo funciona si está seguro de que la lista no contiene cadenas de caracteres unicode. Si puede contener cadenas de 8 bits y unicode, use 'lambda s: s.strip()' como se mencionó anteriormente, o use la función 'strip' que puede importar desde el módulo' strings'. – Cito

79

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

31

Puede utilizar lists comprehensions:

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

o la función map:

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

# without a lambda 
strip_list = map(str.strip, lines) 
+3

La lambda en la segunda versión es overkill. –

+1

Puede usar el mismo enfoque para hacer lo que sea con los valores '0' al principio de la lista, también. Aunque realmente no puedo imaginar qué es lo que estás tratando de lograr al ponerlos en la misma lista de resultados ... –

+1

En Python 3, la 3ra forma "sin una lambda" debe ser 'strip_list = list (map (str) .strip, lines)) 'as map() devuelve un iterador de mapa. https://docs.python.org/3/library/functions.html#map – Devy

7

Esto se puede hacer usando listas por 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']] 
+0

Estaba pensando en cambiar el nombre de 'list' a' map' :) – Casey

2

Todos los demás respuestas, a nd principalmente sobre la comprensión de la lista, son geniales. Pero sólo 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()) 

a es un miembro de su lista, no un índice. Lo que se podría escribir es la siguiente:

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

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

strip_list = [0] * 20 

Pero esto no es tan útil, como .appendanexa cosas a su lista . En su caso, no es útil crear una lista con valores predeterminados, ya que la compilará elemento por artículo al agregar cadenas despojadas.

lo que el código debe ser como:

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

Pero, sin duda, el mejor es éste, ya que esto es exactamente lo mismo:

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

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

Cuestiones relacionadas