循環內用 remove 刪除列表自身元素
問題
在 for i in list 循環中,如果在循環內部使用 list 的 remove 方法刪除多個相鄰的數據時,會出現漏刪和輸出信息錯誤; 當刪除一個數據時,會出現輸出信息錯誤。
例如:
# 創建一個 L list # 刪除相鄰的多個數據 In [12]: L = [11, 22, 33, 44, 55, 66, 77] In [13]: for i in L: ...: if i == 22 or i == 33: ...: L.remove(i) ...: print(i) ...: # 想想這里 print 會打印出什么內容以及現在 L 的內容 11 22 44 55 66 77 # 輸出了本應該被刪除的 22 In [14]: L # L 中本應該被刪除的 33 沒有被刪除, Out[14]: [11, 33, 44, 55, 66, 77] # 如果你在一次性刪除更多的數據或者全部整個列表用循環刪除 # 會發現一個規律,remove 會隔一個數據刪一個 In [20]: L = [11, 22, 33, 44, 55, 66, 77, 88] In [21]: for i in L: ...: L.remove(i) ...: In [22]: L Out[22]: [22, 44, 66, 88]
# 創建一個 L list # 刪除單個數據 In [15]: L = [11, 22, 33, 44, 55, 66, 77] In [16]: for i in L: ...: print(i) ...: if i == 33: ...: L.remove(i) ...: 11 22 33 55 66 77 # 輸出了本應該被刪除的 33 而本沒有被刪除的 44 卻沒有打印出來 In [17]: L Out[17]: [11, 22, 44, 55, 66, 77]
原因
存在一個指針
在刪除多個數據時,當刪除第一項數據時后面的數據會往前移,使得指針指向刪除的數據后面的一項
然后在刪除下一個時會跳過前一個被刪除數據的下一項
解決
可以將需要刪除的項取出來單獨刪除
通過 range 來刪除列表中數據
問題
在通過 len(list) 和 range 函數通過 for 循環來刪除列表元素時,會出現報錯
In [26]: L = [11, 22, 33, 44, 55, 66, 77, 88] In [27]: for i in range(len(L)): ...: if L[i] == 33: ...: del L[i] ...: --------------------------------------------------------------------------- IndexError Traceback (most recent call last) <ipython-input-27-ced9d7033028> in <module>() 1 for i in range(len(L)): ----> 2 if L[i] == 33: 3 del L[i] 4 IndexError: list index out of range # 上面提示超出索引范圍
原因
原因當在循環中刪除數據,然而 range 不會變,所以超出索引
解決
In [28]: L = [11, 22, 33, 44, 55, 66, 77, 88] In [29]: for i in range(len(L)-1,-1,-1): ...: if L[i] == 33: ...: del L[i] ...: In [30]: L Out[30]: [11, 22, 44, 55, 66, 77, 88] range(start, end, step) ====> start->開始 end->結束 step->步長 range(len(L)-1, -1, -1) ====> 從最后一個元素開始遍歷
轉自:https://blog.csdn.net/weixin_42513315/article/details/81912629