遍歷時滿足條件remove要謹慎

2021-08-20 01:41:34 字數 721 閱讀 2403

昨天,乙個bug調了快一天,怎麼都調不出來。讓我一度以為python語言有bug,現在想想自己多麼自大。以後不管再發生什麼bug。一定是自己的錯誤,或者是對模組的使用理解有問題。

在一邊遍歷,一邊判斷滿足條件刪除時,不要從前面進行遍歷。假設乙個列表

a_list = [1,2,3,2,4]
如果遍歷這個list,並且刪除等於2的條目

如果這樣寫**

for item in a_list:

if item == 2:

a_list.remove(item)

一定會出現問題的

當遍歷到1時,index = 0,不會進行remove操作,到1後面的2時,index = 1,則進行刪除操作,那麼list會自動變為

a_list = [1,3,2,4]
同時,遍歷的index = 2,即現在的2。那麼2前面的3則被跳過去了,從而得到無法預期的結果

因此可以從後面進行遍歷,**修改為如下

num = len(a_list)

for i in range(num-1, -1, -1):

if a_list[i] == 2:

a_list.remove(a_list[i])

這樣的話就不會導致無法預期的錯誤

因此,進行迴圈刪除時一定要謹慎!!!!!

STL容器遍歷時刪除元素

stl容器遍歷時在迴圈體內刪除元素最容易出錯了,根本原因都是因為迭代器有效性問題,在此記下通用刪除方法,該方法適用於所有含erase成員函式的序列容器 1 std vectormyvec 23 std vector iterator it myvec.begin 4while it myvec.en...

for迴圈遍歷時var let的區別

for var i 0 i 10 i 輸出 但是,如果我在迴圈時同時呼叫wx的api介面10次,那麼輸出的結果就會不同 這是產生了閉關的效應 for var i 0 i 10 i 1213 14 15 輸出 可以看到輸出了10次10,這是因為i自變數的作用域範圍,在這裡它相當於全域性變數。可以理解為...

Linux grep 同時滿足多個條件

一 或操作 grep e 123 abc filename 找出檔案 filename 中包含123或者包含abc行 egrep 123 abc filename 用egrep同樣可以實現 awk 123 abc filename awk 的實現方式二 與操作 grep pattern1 files...