2013-03-30 14 views
20

Esiste un modo migliore per rimuovere gli ultimi N elementi di un elenco.Rimuovere gli ultimi N elementi di un elenco

for i in range(0,n): 
    lst.pop() 
+4

non chiamare la lista, 'lista'.oppure non sarai in grado di utilizzare la classe 'lista' integrata – jamylak

+0

Daniel, seleziona la risposta appropriata (Luca Citi) a questa domanda. – Sheljohn

risposta

-1

se si desidera rimuovere gli ultimi n elementi, in altre parole, tenere prima len - n elementi:

lst = lst[:len(lst)-n] 

Nota: Questo non è un'operazione in memoria. Creerebbe una copia.

+0

nota che questo in realtà rende una copia dell'elenco fino all'ennesimo elemento, anche se di solito non avrà mai un grande impatto – jamylak

+0

Oh .. :) Solo fatto una nota – karthikr

+32

Come può essere questa la risposta accettata ?! Non dà nemmeno un risultato corretto .. – Vincenzooo

56

occupazione dei n >= 1

>>> L = [1,2,3, 4, 5] 
>>> n=2 
>>> del L[-n:] 
>>> L 
[1, 2, 3] 
+1

Questo ha lo stesso problema menzionato per altre risposte: non funziona per n <= 0. (0 cancella la lista, <0 cancella dal fronte della lista, che potrebbe essere corretta ma potrebbe non esserlo). Se puoi risparmiare tempo per copiare la lista, penso che la risposta a slice di Luca Citi sia migliore, altrimenti hai bisogno di un controllo per n> 0. –

+0

@DanielB. Non funziona su n <= 0 ma è una soluzione semplice e può risolvere i bisogni di molti casi d'uso. Aiuta anche a educare le persone nuove a Python. Chiunque può sentirsi libero di usare qualsiasi soluzione, quindi è bene che abbiamo una varietà – jamylak

7

Basta provare a eliminarlo in questo modo.

del list[-n:] 
+1

funziona per n> 0 !!! – sebhaase

8

vedo questo è stato chiesto un molto tempo fa, ma nessuna delle risposte lo facevano per me; cosa succede se vogliamo ottenere una lista senza gli ultimi N elementi, ma manteniamo quella originale: basta fare list[:-n]. Se è necessario gestire i casi in cui n può essere uguale a 0, è possibile eseguire list[:-n or None].

>>> a = [1,2,3,4,5,6,7] 
>>> b = a[:-4] 
>>> b 
[1, 2, 3] 
>>> a 
[1, 1, 2, 3, 4, 5, 7] 

Semplice.

1

Questo è uno dei casi in cui essere pythonic non funziona per me e può dare bug o problemi nascosti. Nessuna delle soluzioni precedenti funziona per il caso n = 0. Utilizzando l[:len(l)-n] opere nel caso generale:

l=range(4) 
for n in [2,1,0]: #test values for numbers of points to cut 
    print n,l[:len(l)-n] 

Questo è utile per esempio in una funzione per tagliare i bordi di un vettore, in cui si vuole lasciare la possibilità di non tagliare nulla.

16

Come dice giustamente Vincenzooo, il python lst[:-n] non funziona quando n==0.

le seguenti opere per tutti n>=0:

lst = lst[:-n or None] 

Mi piace questa soluzione perché è una specie di leggibile anche in inglese: "restituire una fetta omettendo gli elementi di n ultimi o nessuno (se non ha bisogno di essere omessi)".

Questa soluzione funziona per i seguenti motivi:

  • x or y viene valutato come x quando x è logicamente vero (ad esempio, quando non è 0, "", False, None, ...) e per y altrimenti . Quindi -n or None è -n quando n!=0 e None quando n==0.
  • Quando si taglia, None equivale ad omettere il valore, quindi lst[:None] corrisponde a lst[:] (vedere here).
+2

Questa soluzione è di gran lunga la più cortese E PEP8 amichevole. È particolarmente bello perché rappresenta il caso di 0. Tuttavia, per rispondere alla domanda come viene richiesta, potresti voler cambiare la tua risposta a un compito come questo: "lst = lst [: - n o None]" –

Problemi correlati