2013-03-30 15 views
20

Czy istnieje lepszy sposób na usunięcie ostatnich elementów N z listy.Usuwanie ostatnich elementów N z listy

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

nie wywołuj swojej listy, 'list'.lub nie będziesz mógł użyć wbudowanej klasy 'list' klasy – jamylak

+0

Daniel, wybierz odpowiednią odpowiedź (Luca Citi) na to pytanie. – Sheljohn

Odpowiedz

-1

jeśli chcesz usunąć ostatnie n elementów, czyli innymi słowy, utrzymanie pierwszego len - n elementów:

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

Uwaga: to nie jest operacja w pamięci. Utworziłoby to kopię.

+0

pamiętać, że to faktycznie sprawia, że ​​kopia listy do n-tego elementu, choć zwykle nie będzie miała większego wpływu – jamylak

+0

Oh .. :) Po prostu zanotował: – karthikr

+32

Jak to może być zaakceptowana odpowiedź ?! To nawet nie daje prawidłowego wyniku. – Vincenzooo

56

Works dla n >= 1

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

Ten sam problem dotyczy innych odpowiedzi: nie działa dla n <= 0. (0 usuwa listę, <0 usuwa z przedniej listy, co może być poprawne, ale może nie być). Jeśli możesz poświęcić czas na skopiowanie listy, myślę, że odpowiedź plasterka Luca Citi jest lepsza, w przeciwnym razie potrzebujesz czeku dla n> 0. –

+0

@ Daniella. Nie działa na n <= 0, jednak jest to proste rozwiązanie i może rozwiązać potrzeby wielu przypadków użycia. Pomaga także w kształceniu nowych osób w Pythonie. Każdy może swobodnie korzystać z dowolnego rozwiązania, więc dobrze, że mamy odmianę – jamylak

7

Po prostu spróbuj usunąć problem w ten sposób.

del list[-n:] 
+1

działa dla n> 0 !!! – sebhaase

8

widzę ten został poproszony długo temu, ale żadna z odpowiedzi uczynił go dla mnie; co jeśli chcemy dostać listę bez ostatnich elementów N, ale zachowujemy oryginalną: po prostu robisz list[:-n]. Jeśli potrzebujesz obsługi przypadków, w których n może być równy 0, robisz 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] 

Takie proste.

1

Jest to jeden z przypadków, w których bycie pythonic nie działa dla mnie i może dać ukryte błędy lub bałagan. Żadne z powyższych rozwiązań nie działa dla przypadku n = 0. Korzystanie l[:len(l)-n] prace w ogólnym przypadku:

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

Jest to przydatne na przykład w zależności do wykończenia brzegów wektorze, w którym chcesz zostawić możliwość, aby nie przeciąć wszystko.

16

Jak poprawnie mówi Vincenzooo, pythonic lst[:-n] nie działa, gdy n==0.

Poniższe działa dla wszystkich n>=0:

lst = lst[:-n or None] 

Lubię to rozwiązanie, ponieważ jest to rodzaj czytelny w języku angielskim też: „powrót kawałek pomijając ostatnie elementy N lub Brak (jeśli żaden musi być pominięte) ".

To rozwiązanie działa z powodu następujących powodów:

  • x or y ocenia się x gdy x jest logicznie prawdziwe (np gdy nie jest 0, "", False, None, ...) i do y inaczej . Tak -n or None jest -n, gdy n!=0 i , gdy n==0.
  • Podczas krojenia None jest równoznaczne z pominięciem wartości, więc lst[:None] jest takie samo jak lst[:] (patrz here).
+2

To rozwiązanie jest zdecydowanie najbardziej pythonic AND PEP8 friendly. Jest to szczególnie dobre, ponieważ odpowiada za przypadek 0. Jednak, aby odpowiedzieć na pytanie tak, jak jest zadawane, możesz zmienić swoją odpowiedź na zadanie takie jak: "lst = lst [: - n lub None]" –

Powiązane problemy