¿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?


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.


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

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.


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

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.


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.


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.