Подтвердить что ты не робот

Удалить последние N элементов списка

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

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

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

Для всех n>=0 выполняется следующее:

lst = lst[:-n or None]

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

Это решение работает из-за следующего:

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

Ответ 4

Я вижу, что это было задано давно, но ни один из ответов не сделал это для меня; что, если мы хотим получить список без последних элементов 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]

Проще всего.

Ответ 5

Просто попробуй это сделать.

del list[-n:]

Ответ 6

Это один из случаев, когда 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]

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