2011-01-29 15 views
30

Si tengo una lista y quiero truncarla para que no tenga más de 100 elementos, ¿cómo hago esto?¿Cómo trunco ​​una lista?

+1

¿qué has probado? – SilentGhost

+0

posible duplicar http://stackoverflow.com/questions/1534939/how-to-trim-a-list-in-python –

Respuesta

58

Para modificar la lista en su lugar (en lugar de hacer una copia más corta de la lista), utilice:

del l[100:] 
+1

+1 Totally forgot 'del' funciona con rebanadas. – delnan

+3

rebanar con [: 100] es generalmente una mejor solución ya que tiene un rendimiento constante, pero del a [100:] se vuelve más lento para una lista más grande. – kefeizhou

+2

kefeizhou: Eso podría depender de lo que realmente deseas. Si realmente no necesita las entradas más allá de los primeros 100, debe eliminarlas.Decir que generalmente es una mejor idea mantenerlos por ahí porque esto toma menos tiempo que borrarlos me parece un razonamiento extraño. –

13

Puede utilizar la lista de rebanar:

a = a[0:100] 
+1

Y si absolutamente insiste en liberar el resto no utilizado: del a [100:] – Confusion

+6

@Confusion: el resto obtiene basura recolectada automáticamente si 'a' fue la única referencia a la lista. –

0

Usted puede hacer algo como:

truncated = list[:100] 
4

La otra items[:100] mencionado le da una nueva lista que contiene los primeros 100 elementos de items. Si desea modificar la lista en contexto, use items[:] = items[:100] (asignación de división) o while len(items) > 100: items.pop() use del items[100:] según lo propuesto por Ned Batchelder.

1

Usted puede utilizar rebanar si no te importa simplemente crear una nueva copia de la lista que contiene solo los elementos que desea ... sin embargo, esto deja la lista original sin modificaciones.

>>> a = [0,1,2,3,4,5,6,7,8,9] 
>>> b = a[0:5] 
>>> a 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> b 
[0, 1, 2, 3, 4] 

Si realmente desea truncar la lista original, basta con borrar los elementos que no desee mediante el uso de rebanado con del

>>> del a[5:] 
>>> a 
[0, 1, 2, 3, 4] 
1

La respuesta correcta es, por supuesto:

>>> x = range(10) 
>>> x 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> x = x[:5] 
>>> x 
[0, 1, 2, 3, 4] 

Pero, lo que es más importante, si está interesado en los valores superiores a 100 y quiere sacarlos uno por uno por cualquier razón, también puede usar POP()

>>> x = range(10) 
>>> x 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> x.pop() 
9 
>>> x 
[0, 1, 2, 3, 4, 5, 6, 7, 8] 

Incluso puede especificar qué elemento para sacar:

>>> x= range(10,20) 
>>> x 
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19] 
>>> x.pop(3) 
13 
>>> x.pop() 
19 
>>> x 
[10, 11, 12, 14, 15, 16, 17, 18] 
>>> x.pop(-1) 
18 
[10, 11, 12, 14, 15, 16, 17] 

Esto elimina elementos individuales, acortando la lista, sin copiar.

Por lo tanto, una respuesta obtusa y asquerosa (pero también correcta) sería iterar hacia abajo. Yo sólo voy a bajar de 12 a 8 para facilitar la lectura aquí:

>>> x=range(12) 
>>> for i in range(len(x), 8, -1): 
...  y = x.pop() 
...  print "popping x: ", y, ", x=", x 
... 
popping x: 11 , x= [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
popping x: 10 , x= [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
popping x: 9 , x= [0, 1, 2, 3, 4, 5, 6, 7, 8] 
popping x: 8 , x= [0, 1, 2, 3, 4, 5, 6, 7] 

Claro, no es óptimo, pero sólo se encontró con una situación en la que necesitaba esto, así que pensé en compartir aquí (Estoy truncando una lista cuando veo el primer valor que no es ninguno).

Cuestiones relacionadas