Python 在列表迴圈中的一些坑
阿新 • • 發佈:2019-02-16
迴圈內用 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)
====> 倒序