如下代碼,遍歷列表,刪除列表中的偶數時,結果與預期不符。
a = [11, 20, 4, 5, 16, 28] for i in a: if i % 2 == 0: a.remove(i) print a
得到的結果為:
>>> [11, 4, 5, 28]
其中偶數4和28都沒有刪掉,原因在於for循環在遍歷列表時,是按照元素的索引依次訪問元素的,當刪除其中一個元素后,后面的元素會依次前移,即就是刪除索引1處的元素20后,將訪問索引為2的元素,但由於刪除元素20之后,后面的元素會依次前移,元素4的索引就成了1,就不會訪問了,此時訪問到的元素就是5,元素28沒有刪掉的原因也是一樣。
為了解決這個問題,比較好的方法有下面兩種:
倒序循環遍歷
a = [11, 20, 4, 5, 16, 28] for i in range(len(a)-1, -1, -1): if a[i] % 2 == 0: del a[i]
filter函數
a = [11, 20, 4, 5, 16, 28] b = filter(lambda x: x % 2 != 0, a)
我們要刪除的是偶數,保留的是奇數,所以把奇數過濾出來保存到新的列表b中。