1. 程式人生 > >Python 在列表迴圈中的一些坑

Python 在列表迴圈中的一些坑

迴圈內用 remove 刪除列表自身元素

問題

for i in list 迴圈中,如果在迴圈內部使用 listremove 方法刪除多個相鄰的資料時,會出現漏刪和輸出資訊錯誤; 當刪除一個數據時,會出現輸出資訊錯誤。

例如:

# 建立一個 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) ====> 倒序