[英]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
、 ""
、 False
、 None
、...)時, x or y
計算為x
,否則為y
。 所以-n or None
是-n
當n!=0
和None
當n==0
。None
等效於省略值,因此lst[:None]
與lst[:]
相同(請參見此處)。 正如@swK 所指出的,此解決方案會創建一個新列表(但會立即丟棄舊列表,除非它在其他地方被引用),而不是編輯原始列表。 就性能而言,這通常不是問題,因為一次性創建一個新列表通常比一次刪除一個元素更快(除非n
<< len(lst)
)。 就空間而言,這通常也不是問題,因為通常列表的成員比列表本身占用更多的空間(除非它是一個像bytes
這樣的小對象列表或列表有許多重復的條目)。 另請注意,此解決方案並不完全等同於 OP:如果原始列表被其他變量引用,則與 OP 代碼不同,此解決方案不會修改(縮短)其他副本。
一種適用於n>=0
的可能解決方案(與我原來的風格相同),但是: a) 不創建列表的副本; b) 也會影響對同一列表的其他引用,可能如下:
lst[-n:n and None] = []
這絕對不可讀,不應使用。 實際上,即使是我最初的解決方案,也需要對語言有太多的了解,才能讓每個人都快速閱讀並一目了然。 我不會在任何實際代碼中使用它們,我認為最好的解決方案是@wonder.mice : a[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.