Python 在列表循環中的一些坑


循環內用 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM