rstrip - ¿Hay una mejor manera de usar strip() en una lista de cadenas?-python
strip python 3 español (4)
Esta pregunta ya tiene una respuesta aquí:
Por ahora he estado tratando de realizar strip () en una lista de cadenas y he hecho esto:
i = 0
for j in alist:
alist[i] = j.strip()
i+=1
¿Hay una mejor manera de hacerlo?
Algunas discusiones interesantes sobre el rendimiento sucedieron aquí, así que permítanme proporcionar un punto de referencia:
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
Asi que:
-
map(str.strip, my_list)
es la forma más rápida, es solo un poco más rápido que las comperhensions.- Use
map
oitertools.imap
si hay una sola función que desea aplicar (como str.split) - Usa las comprensiones si hay una expresión más complicada.
- Use
- La iteración manual es la forma más lenta; una explicación razonable es que requiere que el intérprete haga más trabajo y que el tiempo de ejecución eficiente de C haga menos
-
my_list[:] = map...
y asigne el resultado comomy_list[:] = map...
, la notación de la porción solo introduce una pequeña sobrecarga y es probable que le ahorre algunos errores si hay varias referencias a esa lista.- Conoce la diferencia entre mutar una lista y volver a crearla.
Creo que quieres decir
a_list = [s.strip() for s in a_list]
Usar una expresión generadora puede ser un mejor enfoque, como este:
stripped_list = (s.strip() for s in a_list)
ofrece el beneficio de la evaluación perezosa, por lo que la strip
solo se ejecuta cuando se necesita el elemento dado, eliminado.
Si necesita referencias a la lista para que permanezca intacta fuera del alcance actual, es posible que desee utilizar la sintaxis de la porción de lista:
a_list[:] = [s.strip() for s in a_list]
Para los comentaristas interesados en la velocidad de los diferentes enfoques, parece que en CPython el enfoque generador a 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
Podrías usar listas de comprensión.
stripped_list = [j.strip() for j in initial_list]
Probablemente no debería usar la list
como nombre de variable ya que es un tipo. Sin importar:
list = map(str.strip, list)
Esto aplicará la función str.strip
a cada elemento de la list
, devolverá una nueva lista y almacenará el resultado nuevamente en la list
.