2011-01-29 26 views
30

Se ho una lista e voglio troncarla in modo che non siano più di 100 voci, come posso fare?Come troncare un elenco?

+1

cosa hai provato? – SilentGhost

+0

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

risposta

58

Per modificare l'elenco sul posto (piuttosto che fare una copia più corta della lista), l'uso:

del l[100:] 
+1

+1 Completamente dimenticato 'del' funziona con le fette. – delnan

+3

slicing con un [: 100] è generalmente una soluzione migliore poiché ha prestazioni costanti, ma del a [100:] diventa più lento per un elenco più grande. – kefeizhou

+2

kefeizhou: Ciò potrebbe dipendere da ciò che effettivamente si desidera. Se davvero non hai più bisogno delle voci oltre i primi 100, dovresti eliminarle.Dire che è in genere un'idea migliore per tenerli in giro perché questo richiede meno tempo di quanto la cancellazione li sembra un ragionamento strano per me. –

13

È possibile utilizzare l'elenco per affettare:

a = a[0:100] 
+1

E se si vuole assolutamente liberare il resto inutilizzato: del a [100:] – Confusion

+6

@Confusion: la parte restante viene raccolta automaticamente dopo che 'a' è stato l'unico riferimento all'elenco. –

0

Si può fare qualcosa di simile:

truncated = list[:100] 
4

Il items[:100] altro menzionato ti dà una nuova lista che contiene i primi 100 elementi di items. Se si desidera modificare l'elenco sul posto, utilizzare items[:] = items[:100] (assegnazione sezione) o while len(items) > 100: items.pop() utilizzare del items[100:] come proposto da Ned Batchelder.

1

È possibile utilizzare per affettare, se non ti dispiace semplicemente la creazione di una nuova copia della lista che contiene solo gli elementi che vuoi ... tuttavia questo lascia la lista originale non modificata.

>>> 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] 

Se davvero si vuole troncare la lista originale, basta eliminare gli elementi che non si desidera utilizzando affettare con del

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

La risposta corretta è, ovviamente:

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

Ma, soprattutto, se sei interessato ai valori superiori a 100 e vuoi estrarli uno per uno per qualsiasi motivo, puoi anche usare 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] 

Si può anche specificare quale elemento per tirare fuori:

>>> 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] 

Questo rimuove i singoli elementi, accorciando la lista, senza copiare.

Quindi, una risposta ottusa e schifosa (ma anche corretta) sarebbe quella di scorrere verso il basso. Sto solo andando giù 12-8 per facilità di lettura qui:

>>> 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] 

Certo, non è ottimale, ma ho appena imbattuto in una situazione in cui avevo bisogno di questo in modo ho pensato di condividerle qui (Sto troncando una lista quando vedo il primo valore non-Nessuno).