Есть ли лучший способ удалить последние N элементов списка.Удалить последние N элементов списка
for i in range(0,n):
lst.pop()
Есть ли лучший способ удалить последние N элементов списка.Удалить последние N элементов списка
for i in range(0,n):
lst.pop()
, если вы хотите, чтобы удалить последние п элементов, другими словами, держать первые длина - п элементов:
lst = lst[:len(lst)-n]
Примечание: Это не в операции с памятью. Это создаст копию.
, обратите внимание, что это фактически делает копию списка до n-го элемента, хотя обычно он никогда не будет иметь большого влияния – jamylak
Oh .. :) Just сделал заметку – karthikr
Как это можно принять? Он даже не дает правильного результата. – Vincenzooo
Работы для n >= 1
>>> L = [1,2,3, 4, 5]
>>> n=2
>>> del L[-n:]
>>> L
[1, 2, 3]
У этой же проблемы упоминается и для других ответов: она не работает для n <= 0. (0 удаляет список, <0 удаляет из передней части списка, что может быть правильным, но может и не быть). Если вы можете сэкономить время на копирование списка, я думаю, что ответ на кусочек Luca Citi лучше, иначе вам нужно проверить n> 0. –
@ DanielB. Это не работает при n <= 0, однако это простое решение и может решить потребности многих вариантов использования. Также помогает обучать людей, новых для Python. Любой может свободно использовать любое решение, поэтому его хорошо, у нас есть множество – jamylak
Я вижу это был задан вопрос давно, но ни один из ответов это сделал для меня; что, если мы хотим получить список без последних элементов 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]
Как простой.
Это один из случаев, когда 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]
Это полезно, например, в функции обрезки края вектора, где вы хотите, чтобы оставить возможность не вырезать ничего.
Как правильно говорит 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).Это решение на сегодняшний день является самым дружественным pythonic AND PEP8. Это особенно замечательно, потому что в нем учитывается случай 0. Однако, чтобы ответить на заданный вопрос, вы можете изменить свой ответ на задание следующим образом: «lst = lst [: - n или None]» –
не называйте ваш список «списком».или вы не сможете использовать встроенный класс 'list' – jamylak
Daniel, пожалуйста, выберите соответствующий ответ (Luca Citi) на этот вопрос. – Sheljohn