Parece tan "sucio" vaciar una lista de esta manera:
while len(alist) > 0 : alist.pop()
¿Existe una forma clara de hacer eso?
Parece tan "sucio" vaciar una lista de esta manera:
while len(alist) > 0 : alist.pop()
¿Existe una forma clara de hacer eso?
Respuestas:
En realidad, esto elimina el contenido de la lista, pero no reemplaza la etiqueta anterior con una nueva lista vacía:
del lst[:]
Aquí hay un ejemplo:
lst1 = [1, 2, 3]
lst2 = lst1
del lst1[:]
print(lst2)
En aras de la integridad, la asignación de corte tiene el mismo efecto:
lst[:] = []
También se puede usar para reducir una parte de la lista mientras se reemplaza una parte al mismo tiempo (pero eso está fuera del alcance de la pregunta).
Tenga en cuenta que hacer lst = []
no vacía la lista, solo crea un nuevo objeto y lo vincula a la variable lst
, pero la lista anterior seguirá teniendo los mismos elementos, y el efecto será evidente si tuviera otras vinculaciones de variables.
Si se está utilizando Python 3.3 o mejor, se puede utilizar el clear()
método de la list
, que es paralela a la clear()
de dict
, set
, deque
y otros tipos de contenedores mutable:
alist.clear() # removes all items from alist (equivalent to del alist[:])
Según la página de documentación vinculada, lo mismo también se puede lograr con alist *= 0
.
Para resumir, hay cuatro formas equivalentes de borrar una lista en el lugar (¡muy al contrario del Zen de Python !):
alist.clear() # Python 3.3+
del alist[:]
alist[:] = []
alist *= 0
Tu podrías intentar:
alist[:] = []
Lo que significa: empalme en la lista []
(0 elementos) en la ubicación [:]
(todos los índices de principio a fin)
El [:] es el operador de corte. Vea esta pregunta para más información.
alist = []
?
alist
con una lista diferente que está vacía. Si alguien más tiene una referencia a la lista original, eso permanece tal cual (es decir, contiene lo que estaba en él para empezar)
alist.clear()
o alist[:] = []
ayuda a verificar que alist
realmente es una lista. Digamos que alist
regresó de una función foo()
. Pensaste que había foo
devuelto una lista, pero de hecho, devolvió un None
. Usar alist = []
no puede atrapar ese error.
Resulta que con Python 2.5.2, del l[:]
es un poco más lento que l[:] = []
con 1.1 usec.
$ python -mtimeit "l=list(range(1000))" "b=l[:];del b[:]"
10000 loops, best of 3: 29.8 usec per loop
$ python -mtimeit "l=list(range(1000))" "b=l[:];b[:] = []"
10000 loops, best of 3: 28.7 usec per loop
$ python -V
Python 2.5.2
.clear()
, del b[:]
y b[:]=[]
todo funciona igual ( b[:]=[]
siendo un poco más lento.
lst *= 0
tiene el mismo efecto que
lst[:] = []
Es un poco más simple y quizás más fácil de recordar. Aparte de eso, no hay mucho que decir
La eficiencia parece ser la misma.
0
tendría el mismo efecto. Sin embargo, es un truco bastante bueno, estoy un poco triste porque no recibió mucha atención ...
list = []
se restablecerá list
a una lista vacía.
Tenga en cuenta que, por lo general, no debe sombrear los nombres de funciones reservadas, como, por ejemplo list
, cuál es el constructor de un objeto de lista; podría utilizarlo lst
o list_
, por el contrario, por ejemplo.
list
. Si esperaba que una función modificara una lista aprobada (por ejemplo), esto no haría lo que desea.
Otro código simple que podría usar (dependiendo de su situación) es:
index=len(list)-1
while index>=0:
del list[index]
index-=1
Debe comenzar el índice en la longitud de la lista e ir hacia atrás versus el índice en 0, hacia adelante porque eso terminaría con un índice igual a la longitud de la lista y solo se reduciría a la mitad.
Además, asegúrese de que la línea while tenga un signo "mayor o igual que". Omitirlo te dejará con la lista [0] restante.