2012-08-29 10 views
17

Por ahora he estado tratando de llevar a cabo la tira() en una lista de cadenas y lo hice:¿Existe alguna forma mejor de usar strip() en una lista de cadenas? - pitón

i = 0 
for j in alist: 
    alist[i] = j.strip() 
    i+=1 

¿Hay una mejor manera de hacer eso?

+7

Voto ascendente para downvote anónimo anónimo. Si hay algo mal con la pregunta, no tiene sentido rechazarlo sin decirle al autor qué. – KRyan

+0

@DragoonWraith Escucha, escucha. – chucksmash

+3

Si desea iterar usando índices, haga 'for (i, value) en enumerate (alist)' – Kos

Respuesta

26

Probablemente no deba usar list como nombre de variable ya que es un tipo. Independientemente:

list = map(str.strip, list) 

Esto se aplicará la función str.strip a todos los elementos de list, devolver una nueva lista y almacenar el resultado de nuevo en list.

+1

+1 ese es el camino. Y si desea alterar la misma instancia de lista en lugar de vincular la variable a una nueva (por ejemplo, para no romper otras referencias a esta lista), use la sintaxis de división como @kojiro dijo – Kos

+2

Un ejemplo donde 'map' es un excelente elección. ('itertools.imap' podría o no ser mejor, por supuesto, como por ejemplo cuando se asigna a un sector). – Marcin

+0

@Kos En ese caso, una solución basada en iterador sería incluso mejor (ya que evita crear una lista completa que luego no se referencia y espera la recolección de basura). – Marcin

3

Creo que te refieres

a_list = [s.strip() for s in a_list] 

Usando una expresión generadora puede ser un mejor enfoque, así:

stripped_list = (s.strip() for s in a_list) 

ofrece el beneficio de la evaluación perezosa, por lo que el strip sólo se ejecuta cuando el dado elemento, despojado, es necesario.

Si necesita referencias a la lista de permanecer intacta fuera del alcance actual, es posible que desee utilizar la sintaxis lista rebanada .:

a_list[:] = [s.strip() for s in a_list] 

Para comentaristas interesados ​​en la velocidad de los diversos enfoques, que parece como si CPython en el enfoque de generador de corte es el menos eficiente:

>>> from timeit import timeit as t 
>>> t("""a[:]=(s.strip() for s in a)""", """a=[" %d " % s for s in range(10)]""") 
4.35184121131897 
>>> t("""a[:]=[s.strip() for s in a]""", """a=[" %d " % s for s in range(10)]""") 
2.9129951000213623 
>>> t("""a=[s.strip() for s in a]""", """a=[" %d " % s for s in range(10)]""") 
2.47947096824646 
+0

¿Por qué decir "supuestamente un poco más eficiente" en lugar de perfilar y verificar? Y BTW '[:]' es útil porque luego altera la misma lista, no reasigna la variable a una nueva lista. – Kos

+2

Es * menos * eficiente porque tiene que copiar N elementos en lugar de reemplazar la referencia a la lista. La única "ventaja", que puede que no necesite o no desee, es que el cambio sea visible para cualquier persona que tenga otra referencia al objeto de la lista original. – delnan

+0

imho, eso es antiponético. –

18

usted podría utilizar listas por comprensión

stripped_list = [j.strip() for j in initial_list] 
ocurrieron
+0

¿Crees que las comprensiones de listas hacen que el código funcione más rápido? ¿o simplemente más pequeño? – Surya

+0

Las comprensiones de listas son muy eficientes para objetos iterables con reglas simples. Puede usar mapas y listas de comprensión según la complejidad. Pero sí, proporcionan una implementación rápida y eficiente – karthikr

7

Algunas discusiones interesantes sobre el rendimiento aquí, así que me dejaron sirven de referencia:

http://ideone.com/ldId8

noslice_map    : 0.0814900398254 
slice_map    : 0.084676027298 
noslice_comprehension : 0.0927240848541 
slice_comprehension  : 0.124806165695 
iter_manual    : 0.133514881134 
iter_enumerate   : 0.142778873444 
iter_range    : 0.160353899002 

Así:

  1. map(str.strip, my_list) es la manera más rápida, es sólo un poco más rápido que comperhensions.
    • Uso map o itertools.imap si hay una única función que desea aplicar (como str.split)
    • Use comprensiones si hay una expresión más complicada
  2. Manual de iteración es la manera más lenta; una explicación razonable es que requiere que el intérprete haga más trabajo y el tiempo de ejecución eficiente de C rinde menos
  3. Continúe y asigne el resultado como my_list[:] = map..., la notación de división presenta solo una pequeña sobrecarga y es probable que le ahorre algunos errores si hay múltiples referencias a esa lista.
    • Conozca la diferencia entre mutar una lista y volver a crearla.
+0

¿Quiere decir 'mi_lista = mapa (str.strip, list [:])'? Porque a la inversa, me da un NameError. – Izkata

+0

Me refiero a 'my_list [:] = map (str.strip, my_list)'. Vea el código debajo del enlace. – Kos

Cuestiones relacionadas