python循環刪除列表元素常見錯誤與正確方法


常見錯誤一:使用固定長度循環刪除列表元素

l = ['a','b','c']
for i in range(len(l)):
    l.pop(i)

 

報錯:
ValueError: list.remove(x): x not in list

原因:
在刪除list中的元素后,list的實際長度變小了,但是循環次數沒有減少,依然按照原來list的長度進行遍歷,所以會造成索引溢出。是的,i的值是一開始就生成好了(0,1,2),后面不會因為列表大小變化了再變化。

圖示:

執行第一次pop前,i是0

 


 

執行第一次pop后,刪除了索引0原來的a

 

 


 


執行第二次pop前,i是1

 

 


 


執行第二次pop后,刪除了索引1原來的c

 

 


 


執行第三次pop前,i是2。繼續執行pop,索引2已超出了列表范圍(此時列表只有索引0了)。

 

 


 

解決方法:倒序循環遍歷

l = ['a','b','c']
for i in range(len(l)-1, -1, -1):
    l.pop(i)

 

 

常見錯誤二:正序循環遍歷刪除列表元素

l = ['a','b','c']
for i in l:
    l.remove(i)
print l

 

結果:
['b']

原因:
按順序循環刪除,怎么會有一個沒刪除呢?原因同上,i的值是一開始就生成好了(0,1,2),后面不會因為列表大小變化了再變化。但是列表因為值的刪除,是在變化的。

圖示:
執行第一次remove前,i是索引0的a

 

 


 


執行第一次remove后,i是索引0的a被刪除

 

 


 

執行第二次remove前,i是索引1的c

 

 


 


執行第二次remove后,i是索引1的c被刪除。之后繼續執行i是索引2,此時列表已經沒有索引2了,循環退出。最后b就被剩下了。

 

 


解決方法一:倒序循環遍歷:

l = ['a','b','c']
for i in l[::-1]:
    l.remove(i)
print l

 

解決方法二:深拷貝一個ll,對l遍歷,對ll操作

l = ['a','b','c']
ll = l[:]
for i in l:
    ll.remove(i)

此方法的缺點是對於過大的list,拷貝后可能很占內存。那么對於這種情況,可以用倒序遍歷的方法來實現。

 

---------------------------------------------------------------------------------

關注微信公眾號(測試工程師小站)即可在手機上查閱,並可接收更多測試分享,發送【測試資料】更可獲取百G測試教程~


免責聲明!

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



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