2009-09-20 68 views
12

我有一個列表L.刪除列表(蟒蛇)的許多元素

我可以通過做刪除元素i:

del L[i] 

但如果我有一組非連續的索引中刪除?

I=set([i1, i2, i3,...]) 

這樣做:

for i in I: 
    del L[i] 

將無法​​工作。

任何想法?

+1

dupe http://stackoverflow.com/questions/497426/deleting-multiple-elements-from-a-list – SilentGhost 2009-09-21 16:33:06

回答

31

EINE Minuten BITTE,ICH HAP EINE 克萊Problemo AVEC diese Religione。 - 艾迪·伊扎德通過反向遍歷列表保存迭代器(做他的印象馬丁路德 )

刪除是這個問題的共同解決方案。但另一個解決方案是將其變成另一個問題。使用某些標準(在您的情況下,索引存在於要刪除的索引列表中)而不是從列表中刪除項目,請創建一個新列表,以排除違規項目。

L[:] = [ item for i,item in enumerate(L) if i not in I ] 

對於這個問題,你從哪兒拿出索引以I擺在首位?您可以將獲取索引的邏輯組合起來並構建新列表。假設這是一個對象的列表,你只需要保留那些傳遞一個isValid測試:

L[:] = [ item for item in L if item.isValid() ] 

這比要簡單得多:

I = set() 
for i in range(len(L)): 
    if not L[i].isValid(): 
     I.add(i) 

for i in sorted(I, reverse=True): 
    del L[i] 

在大多數情況下,我把任何問題關於「如何從列表中刪除我不想要的項目」轉換爲「如何創建僅包含我想要的項目的新列表」。

編輯:根據Alex Martelli對this question的回答,將「L = ...」更改爲「L [:] = ...」。

+0

這對於大型列表有何影響? – jmucchiello 2009-09-20 03:17:53

+1

事實證明,列表得到的時間越長越好。請參閱此測試代碼:http://pastebin.com/f5bf9e3e8。 – PaulMcG 2009-09-20 04:25:17

+0

這是這樣做的方式;注意「I」應該是一個集合,而不是一個列表。 – 2009-09-20 07:24:53

9
for i in I: 
    del L[i] 

將無法​​正常工作,因爲(根據訂單),你可能會使迭代器 - 這通常會顯示爲您打算刪除剩餘列表中的一些項目。

從索引的相反順序刪除列表中的項目總是安全的。要做到這一點最簡單的方法是用排序():

for i in sorted(I, reverse=True): 
    del L[i] 
+0

這是一個好主意。 :D 我不確定是否反轉(列表(I))是正確的?但我明白了:按照相反的順序對索引進行排序,然後刪除。 – Ezequiel 2009-09-20 02:28:04

+0

您需要list(),因爲您無法直接在集合上調用reversed()。 – dcrosta 2009-09-20 02:29:23

+0

哎呀,那真是愚蠢!我不是指顛倒(列表(...)),我的意思是排序(...,reverse = True) – dcrosta 2009-09-20 02:30:58

1

如果您的原始清單數據可以安全地變成一組(即所有的獨特的價值觀,也不需要維護秩序),你也可以使用組操作:

Lset = set(L) 
newset = Lset.difference(I) 

你也可以做,也許一件Bag/Multiset,儘管它可能不值得。 Paul McGuire的第二個listcomp解決方案對於大多數情況來說絕對是最好的。

-1
L = [ item for item in L if L.index(item) not in I ] 
4

您可以使用numpy.delete如下:

import numpy as np 
a = ['a', 'l', 3.14, 42, 'u'] 
I = [1, 3, 4] 
np.delete(a, I).tolist() 
# Returns: ['a', '3.14'] 

如果你不介意,並在最後一個numpy陣列結束了,你可以離開了.tolist()。您也應該看到一些非常重要的速度改進,使其成爲一個更具可擴展性的解決方案。我沒有對它進行基準測試,但是numpy操作是用C或Fortran編寫的編譯代碼。