Есть ли лучший способ удалить последние 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]
Это полезно, например, в функции обрезки краев вектора, где вы хотите оставить возможность ничего не вырезать.