删除列表的最后N个元素

The*_*heo 35 python list

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

for i in range(0,n):
    lst.pop( )
Run Code Online (Sandbox Code Playgroud)

jam*_*lak 77

效劳于 n >= 1

>>> L = [1,2,3, 4, 5]
>>> n=2
>>> del L[-n:]
>>> L
[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

  • 在我看来,这应该是公认的答案,它不会创建新列表,并且 @jamylak 正确指出检查 n >= 1 (2认同)

Luc*_*iti 21

正如Vincenzooo正确地说的那样,pythonic lst[:-n]无法正常工作n==0.

以下适用于所有人n>=0:

lst = lst[:-n or None]
Run Code Online (Sandbox Code Playgroud)

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

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

  • x or y计算结果为x当x逻辑真(例如,当它不是0,"",False,None,...)及y其他.所以,-n or None是-n时候n!=0和None当n==0.
  • 切片时,None相当于省略了值,所以lst[:None]与lst[:](见这里)相同.

  • 这个解决方案是迄今为止最为pythonic和PEP8友好的解决方案.它特别好,因为它解释了0的情况.但是,要回答问题的答案,你可能想要改变你的答案,如下所示:"lst = lst [: - n或None]" (2认同)

kar*_*ikr 15

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

lst = lst[:len(lst)-n]
Run Code Online (Sandbox Code Playgroud)

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

  • 这怎么可以成为公认的答案?!它甚至没有给出正确的结果.. (37认同)
  • @Shreyash_Ag 在我发表评论一年多后,答案得到纠正。查看编辑日期和编辑历史。 (3认同)

won*_*ice 9

应该使用这个:

a[len(a)-n:] = []
Run Code Online (Sandbox Code Playgroud)

或这个:

del a[len(a)-n:]
Run Code Online (Sandbox Code Playgroud)

它要快得多,因为它确实从现有数组中删除了项目。相反的 ( 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
Run Code Online (Sandbox Code Playgroud)

如果0 < n你可以使用a[-n:] = []或者del a[-n:]哪个更快。


Yar*_*kee 8

试着这样做吧.

del list[-n:]
Run Code Online (Sandbox Code Playgroud)


cha*_*ni2 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]
Run Code Online (Sandbox Code Playgroud)

就如此容易.