2013-03-30 111 views
20

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

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

不要打电话给你的名单,“列表”。或者你将无法使用内置的“列表”类别 – jamylak

+0

丹尼尔,请选择适当的答案(卢卡花旗)这个问题。 – Sheljohn

回答

-1
如果你想删除的最后n个元素,换句话说,保持前len

- n个元素:

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

注:这是不是记忆中的操作。它会创建一个副本。

+0

请注意,这实际上使列表副本达到第n个元素,尽管它通常不会产生太大的影响 – jamylak

+0

哦.. :)做了一个便条 – karthikr

+32

这怎么可能是被接受的答案?!它甚至没有给出正确的结果.. – Vincenzooo

56

Works为n >= 1

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

这与其他答案提到的问题相同:它不适用于n <= 0(0删除列表,<0从列表的前面删除,这可能是正确的,但可能不是)。如果您可以抽出时间复制名单,我认为卢卡花旗的切片答案会更好,否则您需要检查n> 0。 –

+0

@丹尼尔B.它在n <= 0时不起作用,但它是一个简单的解决方案,可以解决许多用例的需求。还有助于教育新来Python的人。任何人都可以随意使用任何解决方案,所以它的好处是我们有各种各样的 – jamylak

7

试试像这样删除它。

del list[-n:] 
+1

适用于n> 0! – sebhaase

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] 

就这么简单。

1

这是其中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] 

这是例如在功能修整载体,要离开的可能性不切东西的边缘是有用的。

16

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

所有n>=0以下工作:

lst = lst[:-n or None] 

我喜欢这个方案,因为它是英文那种可读太:“返回片省略最后n个元素或无(如果没有需要被忽略)”。

此解决方案是因为以下几点:

  • x or y评估为xx是逻辑真(例如,当它不0""FalseNone,...)和y否则。所以-n or None-n,当时n!=0Nonen==0
  • 切片时,None相当于省略该值,因此lst[:None]lst[:](请参阅here)相同。
+2

这个解决方案是迄今为止最pythonic和PEP8友好。这是非常好的,因为它解释了0的情况。但是,要回答问题时,您可能想要将答案更改为如下所示的分配:“lst = lst [: - n或None]” –

相关问题