簡體   English   中英

刪除列表的最后 N 個元素

[英]Remove the last N elements of a list

有沒有更好的方法來刪除列表的最后 N 個元素。

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

適用於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]

注意:這不是內存操作。 它會創建一個淺拷貝。

正如 Vincenzooo 正確說的那樣,pythonic lst[:-n]n==0時不起作用。

以下適用於所有n>=0

lst = lst[:-n or None]

我喜歡這個解決方案,因為它在英語中也很可讀:“返回一個省略最后 n 個元素或沒有(如果不需要省略)的切片”。

此解決方案有效,原因如下:

  • x在邏輯上為真時(例如,當它不是0""FalseNone 、...)時, x or y計算為x ,否則為y 所以-n or None-nn!=0Nonen==0
  • 切片時, None等效於省略值,因此lst[:None]lst[:]相同(請參見此處)。

正如@swK 所指出的,此解決方案會創建一個新列表(但會立即丟棄舊列表,除非它在其他地方被引用),而不是編輯原始列表。 就性能而言,這通常不是問題,因為一次性創建一個新列表通常比一次刪除一個元素更快(除非n << len(lst) )。 就空間而言,這通常也不是問題,因為通常列表的成員比列表本身占用更多的空間(除非它是一個像bytes這樣的小對象列表或列表有許多重復的條目)。 另請注意,此解決方案並不完全等同於 OP:如果原始列表被其他變量引用,則與 OP 代碼不同,此解決方案不會修改(縮短)其他副本

一種適用於n>=0的可能解決方案(與我原來的風格相同),但是: a) 不創建列表的副本; b) 也會影響對同一列表的其他引用,可能如下:

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

這絕對不可讀,不應使用。 實際上,即使是我最初的解決方案,也需要對語言有太多的了解,才能讓每個人都快速閱讀並一目了然。 我不會在任何實際代碼中使用它們,我認為最好的解決方案是@wonder.micea[len(a)-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]

就如此容易。

應該使用這個:

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:] ,這會更快。

這是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]

這對於例如在修剪矢量邊緣的函數中很有用,您希望在其中保留不切割任何東西的可能性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM