有没有更好的方法来删除列表的最后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)
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[:](见这里)相同.kar*_*ikr 15
如果你想删除最后n个元素,换句话说,保留第一个len-n元素:
lst = lst[:len(lst)-n]
Run Code Online (Sandbox Code Playgroud)
注意:这不是内存操作.它会创建一个副本.
应该使用这个:
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:]哪个更快。
我看到这个被问得早,但没有一个答案做了我; 如果我们想要获得没有最后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)
就如此容易.