¿Cómo vaciar una lista?

356

Parece tan "sucio" vaciar una lista de esta manera:

while len(alist) > 0 : alist.pop()

¿Existe una forma clara de hacer eso?

DrFalk3n
fuente
28
Entonces, ¿por qué los dictados y conjuntos de Python tienen un método clear (), pero no listas?
trabajo
13
Pero si hay múltiples referencias al objeto, podría ser útil.
Ned Deily
3
Puede ser útil si necesito borrar una lista compartida de los procesos en tiempo de ejecución y no necesito esperar a que se efectúen los garbaging (¿o me equivoco? ¿Entendí mal la recolección de basura?). Además, si quiero verificar cada elemento emergente, puedo depurarlo mientras no puedo usar el corte (o me equivoco). No necesito detener la ejecución del proceso mientras borro mi lista.
DrFalk3n
2
@ S.Lott El hecho de que no entiendas por qué esto es importante no significa que el resto de nosotros no. Si varios objetos dependen de una lista común, será importante. En varios patrones de diseño esto es importante. El recolector de basura significa que no tienes que limpiar después de ti mismo; No es una licencia hacer más desorden.
UpAndAdam
44
A pesar de cualquier otra respuesta mejor, su código inicial podría haberse escrito: while alist: alist.pop ()
MrWonderful

Respuestas:

570

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.

fortran
fuente
3
Dos preguntas más: ¿Qué es exactamente "del"? (Deduzco que borra las cosas, pero realmente no sé qué es) y 2do: ¿Cómo se lee (en voz alta) [:]
OscarRyz
2
Para una explicación del sonido de, me refiero a los documentos: docs.python.org/reference/simple_stmts.html#the-del-statement
FORTRAN
14
Por lo general, no leo en voz alta el código de Python xD, pero si tuviera que hacerlo, creo que diría "cortar desde el principio hasta el final de la lista l".
fortran
2
@jellybean completamente involuntario ^ _ ^ El inglés no es mi lengua materna, por lo que realmente no noté el contraste entre los dos comentarios.
Fortran
si hacemos l = [], ¿el contenido de la lista anterior no será recolectado por Python GC?
Alex Punnen
168

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, dequey 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 !):

  1. alist.clear() # Python 3.3+
  2. del alist[:]
  3. alist[:] = []
  4. alist *= 0
Eugene Yarmash
fuente
66
Esta respuesta debe estar en la parte superior, ¿qué hay de malo con stackoverflow!
BreakBadSP
claro () es mejor.
sailfish009
61

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.

Adam Batkin
fuente
44
¿Por qué no solo alist = []?
mitenka
16
@mitenka que no vacía la lista, sobrescribe la variable alistcon 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)
Adam Batkin
@mitenka Otra razón es que alist.clear()o alist[:] = []ayuda a verificar que alistrealmente es una lista. Digamos que alistregresó de una función foo(). Pensaste que había foodevuelto una lista, pero de hecho, devolvió un None. Usar alist = []no puede atrapar ese error.
aafulei
32

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
Dan D.
fuente
1
En Python 2.7.2, en mi máquina, son casi lo mismo. Ambos corren desde 13.5-13.7 usec por ciclo.
leetNightshade
También debe medir python3 -mtimeit "l = list (range (1000))" "b = l [:]" para calcular "b [:] = []" y "del b [:]". Do it and lol ...
rockdaboot
1
Hice el benchmark con python 3.5 y estoy de acuerdo con leetNightshade. .clear(), del b[:]y b[:]=[]todo funciona igual ( b[:]=[]siendo un poco más lento.
Conchylicultor
5
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.

Ivan Hoffmann
fuente
1
En aras de la exhaustividad, vale la pena mencionar que cualquier número entero que sea menor o igual que 0tendría el mismo efecto. Sin embargo, es un truco bastante bueno, estoy un poco triste porque no recibió mucha atención ...
Peter Varo
-1
list = []

se restablecerá lista 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 lsto list_, por el contrario, por ejemplo.

Mark Rushakoff
fuente
38
No: esto no modificará la lista, solo asigna una lista vacía a la variable list. Si esperaba que una función modificara una lista aprobada (por ejemplo), esto no haría lo que desea.
Adam Batkin
10
Realmente no. La pregunta es "Cómo vaciar una lista" no "Cómo asignar sobre una variable que contiene una lista"
Adam Batkin
66
la cuestión no era ambigua, fragmento de la op fue apareciendo los elementos de la lista (eso es, modificándolo en su lugar) ...
FORTRAN
77
Además, "lista" no debe usarse como un nombre de variable, ya que es una sombra del tipo "lista". Muchos desarrolladores de Python usan "L" como nombre de variable de lista, pero prefiero "lst".
steveha
1
A veces solo quieres vaciar la lista y esto es tan bueno como cualquiera de los métodos propuestos. Probablemente aún más rápido
smac89
-3

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.

Donald
fuente
15
reinventar la rueda con un cubo
CONvid19
Jaja. Esta es la segunda respuesta extraña (+ un comentario apropiado) que he encontrado en SO. Debería haber un sitio para estas cosas memorables: D
akinuri