2011-04-11 41 views
0

這是我的代碼:從Python列表中刪除每個值的某個值?

a = [1,2,3,43,43,43] 

count = a.count(43) 
if count > 0: 
    for i in range(count): 
     a.remove(43) 

print a 

有沒有一種簡單的方法來實現這一目標?

+1

這也不是一個很好的算法。每次你執行'a.remove(43)'時,Python都會從列表的開頭再次開始,所以你一遍又一遍地測試值[1,2,3]。在大O標記中,這是O(n^2)。下面使用簡單的列表理解的答案是O(n) – 2011-04-11 07:01:50

回答

8

嘗試

a = [x for x in a if x != 43] 
3

嘗試itertools

>>> import itertools 
>>> a = [1, 2, 3, 43, 43, 45] 
>>> iter = itertools.ifilter(lambda x: x != 43, a) 
>>> list(iter) 
[1, 2, 3] 
+0

通常,列表理解和生成器表達式更好。 – minhee 2011-04-11 06:36:08

+0

是的,我同意:) – 2011-04-11 06:37:04

+3

'itertools'是建立在標準生成器工具上的一組不錯的工具。這是非常有用的,但我認爲這個具體問題有點矯枉過正。 – 2011-04-11 06:39:03

1

是你只想刪除列表中的所有a 43S什麼?

a = [x for x in a if x != 43] 
+1

那裏有小字謎嗎?它不應該是'[x for a ...而不是'[a for a x in a ...']嗎? – 2011-04-11 06:37:40

+0

是的,你是對的。我編輯過。 – minhee 2011-04-11 06:41:33

3

請注意,上述所有的解決方案(除了一個用刪除,而是一個具有非線性執行時間)將創建一個新的列表,而不是修改原來的到位。這可能會或可能不會成爲你的情況的問題。如果要修改原始列表,則必須使用切片分配,例如:

a[:] = [value for value in a if value != 43] 
+0

這裏爲什麼需要分片分配? – 2011-04-11 22:07:04

+2

正如我在代碼上面的註釋中所說的那樣,這是如果您想要修改原始列表。如果列表作爲函數中的參數傳遞,並且您希望該函數具有修改調用程序所看到的列表的副作用,這可能很重要。 – 2011-04-12 12:40:59

+1

+1啊,好榜樣! – 2011-04-13 05:44:05