2011-03-17 112 views
1

可能重複:
Removing an element from a list based on a predicate簡單的方法來從列表中刪除元素在Python

假如我有一個名單,我想從它的元素尊重的條件刪除,,我怎麼能實現這個更容易?

我試着用:

for i in range (len(list)):  
    if [condition]: 
     del(list[i]); 

顯然,這是行不通的......在我心中唯一的辦法就是做轉移到左邊來代替我要刪除的元素,然後刪除最後一個元素無論如何,有沒有更快的解決方案?

+2

不要使用'list'作爲變量名稱。 – 2011-03-17 13:06:05

+0

根據索引從列表中刪除項目時循環列表並不好。此外,我會避免命名你的列表變量'列表' – JoshAdel 2011-03-17 13:06:44

回答

0

如果您需要修改就地列表(所以其他人提出的建議filter或者列表理解都不會幫你)那麼:

  1. 您可以避免通過以相反順序處理元素而給出的代碼徹底失敗,以便刪除一個不會影響稍後處理元素的編號。

  2. 轉移元素以將「死」的元素放在最後幾乎肯定不值得,但如果你這樣做,你可以通過在最後刪除所有死元素,而不是像你看到的那樣去掉每一個元素。 (從中獲得的收益很可能很小,刪除列表中的最後一個元素是便宜的,除非它碰巧觸發了實際的調整大小,這在設計上並不經常執行)。

  3. 如果發生這種情況你正在刪除很多元素 - 列表中所有元素的很大一部分 - 然後上面2中的「不值得」不那麼明顯,你應該用兩種方式進行基準測試。

4

最簡單的方法是使用filter創建列表的副本:

list_removed = filter(lambda item: not condition(item), list) 
+0

當然你的意思是'lambda項目:不條件'? – 2011-03-17 13:11:43

+0

@Hugh:我確定。感謝捕捉,並修復。 – 2011-03-17 13:15:10

12

如何使用列表理解:

mylist = [x for x in mylist if not condition] 
+1

+1 for'not condition' – eumiro 2011-03-17 13:08:37

+0

謝謝!非常有幫助和簡單 – shaku 2011-03-17 13:12:15

1

我推薦@ Space_C0wb0y的解決方案;然而,爲了完整我想指出,

for i in range(len(lst)-1, -1, -1):  
    if (condition): 
     del lst[i] 

正常工作。

+1

它的工作原理是O(n^2),而列表理解或過濾器調用是O(n)。這可能並不總是重要的,但列表理解不可能永遠是錯誤的選擇。 – Duncan 2011-03-17 13:37:46

+0

@Duncan:不爭論,但你怎麼得到O(n ** 2)? – 2011-03-17 13:39:52

+3

我相信這是因爲每次刪除列表中的項目時,所有的結尾項目都會向下移動一個。看到這個答案的結尾是一個就地,保持順序的過濾器(我想!)可以避免這個問題:http://stackoverflow.com/questions/5162991/list-manipulation-with-pop-python/5163010#作爲@senderle,5163010 – senderle 2011-03-17 14:27:35

相關問題