復現的情況大概可以寫成這樣
abc = [1, 2, 2, 3, 4] print abc for index, i in enumerate(abc): if i == 2: del abc[index] print abc
可以發現一個問題,按照我的想法這個例子將會把兩個2都刪除了之后得到一個只有元素[1, 3, 4]的abc。
但是實際操作之后發現,其將返回一個[1, 2, 3, 4]的數組
這究竟是怎么導致的????
問題就在於我直接在原始數組里面del掉了某個符合條件的元素,比如我在index==1的時候刪掉了第一個2 這個時候再進行下次循環的時候index==2但是原來的數組abc編程了[1, 2, 3, 4],而index==2是3,跳過了2導致了結果與我們的預期完全不一樣了。
我用了一個站位的方式來占着需要刪除的家伙,然后讓index依然可以正常尋址,但死這個方法。並不是最好的,因為數組的insert方法在非常大的情況下面效率非常低。
abc = [1, 2, 2, 3, 4] print abc for index, i in enumerate(abc): if i == 2: del abc[index] abc.insert(index, None) print filter(None, abc)
應該有更好的辦法?
由於判斷條件的關系。。我直接用了一個更取巧的辦法
abc = [1, 2, 2, 3, 4] print abc for index, i in enumerate(abc): if i == 2: abc[index] = None print filter(None, abc)
直接給符合條件的元素賦值成不可能的值,最后再來過濾,這樣也不用使用O(n)的insert方法,效率更好。