2013-03-30 4 views
20

Есть ли лучший способ удалить последние N элементов списка.Удалить последние N элементов списка

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

не называйте ваш список «списком».или вы не сможете использовать встроенный класс 'list' – jamylak

+0

Daniel, пожалуйста, выберите соответствующий ответ (Luca Citi) на этот вопрос. – Sheljohn

ответ

-1

, если вы хотите, чтобы удалить последние п элементов, другими словами, держать первые длина - п элементов:

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

Примечание: Это не в операции с памятью. Это создаст копию.

+0

, обратите внимание, что это фактически делает копию списка до n-го элемента, хотя обычно он никогда не будет иметь большого влияния – jamylak

+0

Oh .. :) Just сделал заметку – karthikr

+32

Как это можно принять? Он даже не дает правильного результата. – Vincenzooo

56

Работы для n >= 1

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

У этой же проблемы упоминается и для других ответов: она не работает для n <= 0. (0 удаляет список, <0 удаляет из передней части списка, что может быть правильным, но может и не быть). Если вы можете сэкономить время на копирование списка, я думаю, что ответ на кусочек Luca Citi лучше, иначе вам нужно проверить n> 0. –

+0

@ DanielB. Это не работает при n <= 0, однако это простое решение и может решить потребности многих вариантов использования. Также помогает обучать людей, новых для Python. Любой может свободно использовать любое решение, поэтому его хорошо, у нас есть множество – jamylak

7

Просто попробуйте это так.

del list[-n:] 
+1

работает для n> 0 !!! – sebhaase

8

Я вижу это был задан вопрос давно, но ни один из ответов это сделал для меня; что, если мы хотим получить список без последних элементов N, но сохраним исходный: вы просто делаете list[:-n]. Если вам необходимо обрабатывать случаи, когда n может равняться 0, вы делаете 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] 

Как простой.

1

Это один из случаев, когда pythonic не работает для меня и может содержать скрытые ошибки или беспорядок. Ни одно из решений выше не работает для случая n = 0. Использование l[:len(l)-n] работ в общем случае:

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

Это полезно, например, в функции обрезки края вектора, где вы хотите, чтобы оставить возможность не вырезать ничего.

16

Как правильно говорит Vincenzooo, pythonic lst[:-n] не работает, когда n==0.

следующие работы для всех n>=0:

lst = lst[:-n or None] 

Мне нравится это решение, потому что это своего рода читаемым и на английском языке: «вернуть кусочек опуская последние п элементов, либо не (если не должен быть пропущен ни один)».

Это решение работает по следующим причинам:

  • x or y вычисляет x когда x логически верно (например, когда он не 0, "", False, None ...) и y иначе , Таким образом, -n or None является -n, когда n!=0 и None когда n==0.
  • При нарезке None эквивалентно опусканию значения, поэтому lst[:None] - это то же самое, что и lst[:] (см. here).
+2

Это решение на сегодняшний день является самым дружественным pythonic AND PEP8. Это особенно замечательно, потому что в нем учитывается случай 0. Однако, чтобы ответить на заданный вопрос, вы можете изменить свой ответ на задание следующим образом: «lst = lst [: - n или None]» –

Смежные вопросы