Есть ли лучший способ удалить последние N элементов списка.
for i in range(0,n):
lst.pop( )
Есть ли лучший способ удалить последние N элементов списка.
for i in range(0,n):
lst.pop( )
если вы хотите удалить последние n элементов, другими словами, сохраните первые len-n элементы:
lst = lst[:len(lst)-n]
Примечание. Это не операция с памятью. Это создаст копию.
Работает для n >= 1
>>> L = [1,2,3, 4, 5]
>>> n=2
>>> del L[-n:]
>>> L
[1, 2, 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[:] (см. здесь).Я вижу, что это было задано давно, но ни один из ответов не сделал это для меня; что, если мы хотим получить список без последних элементов 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]
Проще всего.
Просто попробуй это сделать.
del list[-n:]
Это один из случаев, когда 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]
Это полезно, например, в функции обрезки краев вектора, где вы хотите оставить возможность ничего не вырезать.