删除列表的最后N个元素

时间:2013-03-30 06:57:20

标签: python list

有没有更好的方法来删除列表的最后N个元素。

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

7 个答案:

答案 0 :(得分:70)

适用于n >= 1

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

答案 1 :(得分:20)

正如Vincenzooo所说,lst[:-n]时pythonic n==0不起作用。

以下适用于所有n>=0

lst = lst[:-n or None]

我喜欢这个解决方案,因为它在英语中也是可读的:“返回省略最后n个元素的片段或没有(如果不需要省略)”。

此解决方案的工作原理如下:

    {li> x or yx逻辑上为真时评估为x(例如,当0""False,{时{1}},...)和None否则。因此y -n or None -n n!=0 None n==0。{/ 1}
  • 切片时,None相当于省略了值,因此lst[:None]lst[:]相同(请参阅here)。

答案 2 :(得分:8)

如果你想删除最后n个元素,换句话说,保留第一个len-n元素:

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

注意:这不是内存操作。它会创建一个副本。

答案 3 :(得分:8)

试着这样做。

del list[-n:]

答案 4 :(得分: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]

就这么简单。

答案 5 :(得分:3)

应该使用这个:

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

或者这个:

del a[len(a)-n:]

速度要快得多,因为它确实会从现有阵列中删除项目。相反的(a = a[:len(a)-1])创建新的列表对象并且效率较低。

>>> timeit.timeit("a = a[:len(a)-1]\na.append(1)", setup="a=range(100)", number=10000000)
6.833014965057373
>>> timeit.timeit("a[len(a)-1:] = []\na.append(1)", setup="a=range(100)", number=10000000)
2.0737061500549316
>>> timeit.timeit("a[-1:] = []\na.append(1)", setup="a=range(100)", number=10000000)
1.507638931274414
>>> timeit.timeit("del a[-1:]\na.append(1)", setup="a=range(100)", number=10000000)
1.2029790878295898

如果0 < n您可以使用更快的a[-n:] = []del a[-n:]

答案 6 :(得分:1)

这是f = open("log_file.log", 'r') data = f.readlines() for i in data: print i >>> line >>> ... >>> ... 对我不起作用并且可能给出隐藏的错误或混乱的情况之一。 上述解决方案均不适用于n = 0的情况。 使用pythonic适用于一般情况:

l[:len(l)-n]

这在例如修剪矢量边缘的函数中非常有用,你想要留下切割任何东西的可能性。