有没有更好的方法来删除列表的最后N个元素。
for i in range(0,n):
lst.pop( )
答案 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个元素的片段或没有(如果不需要省略)”。
此解决方案的工作原理如下:
x or y
在x
逻辑上为真时评估为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]
这在例如修剪矢量边缘的函数中非常有用,你想要留下切割任何东西的可能性。