删除列表的最后 N 个元素

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

for i in range(0,n):
lst.pop( )
129585 次浏览

n >= 1工作

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

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

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

注意: 这不是内存中的操作。它将创建一个浅表副本。

试试这样做。

del list[-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]

就这么简单。

这是其中一种情况,在这种情况下,作为 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 正确地说,蟒蛇 lst[:-n]不工作时,n==0

以下是所有 n>=0的作品:

lst = lst[:-n or None]

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

这种解决办法之所以奏效,是因为:

  • x在逻辑上为真时(例如,当它不是 0""FalseNone、 ...) ,x or y计算为 x,否则计算为 y。所以 -n or Nonex0时是 -nx2时是 None
  • 在切片时,None等效于省略该值,因此 lst[:None]lst[:]相同(参见 给你)。

正如@swK 所指出的,这个解决方案创建了一个新列表(但是立即丢弃旧的列表,除非它在其他地方被引用) ,而不是编辑原来的列表。这在性能方面通常不是问题,因为一次创建一个新列表通常比一次删除一个元素要快(除非 n < < len(lst))。在空间方面,这通常也不是问题,因为列表的成员通常比列表本身占用更多的空间(除非是像 bytes这样的小对象列表或者列表有许多重复的条目)。还请注意,这个解决方案并不完全等同于 OP 的: 如果原始列表被其他变量引用,则此解决方案不会修改(缩短)其他副本,这与 OP 的代码不同。

一个可能的解决方案(与我最初的解决方案相同的风格)适用于 n>=0,但是: a)不创建列表的副本; b)也会影响对同一列表的其他引用,可能是下面的:

    lst[-n:n and None] = []

这绝对是不可读的,不应该使用。实际上,即使是我最初的解决方案,也需要对语言有太多的理解,以至于每个人都很难快速阅读并且一目了然地理解它。我不会在任何实际的代码中使用它们,我认为最好的解决方案是通过 @ 好奇,老鼠: a[len(a)-n:] = []

应该用这个:

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:],这是更快的。