Python遍歷列表時刪除元素案例
tk在科學養(yǎng)豬群里問bluerust、scz是否碰上過這個Python坑,
示例1:
bas = [ 'ba1', 'ba2', 'ba3', 'ba4', 'ba5' ]
for ba in bas :
print( ba )
if ( ba.find( 'ba' ) != -1 ) :
bas.remove( ba )
print( bas )
print( bas )即遍歷list的過程中動態(tài)刪除元素。
上述代碼輸出如下:
ba1 ['ba2', 'ba3', 'ba4', 'ba5'] ba3 // ba2被跳過去了 ['ba2', 'ba4', 'ba5'] ba5 // ba4被跳過去了 ['ba2', 'ba4'] ['ba2', 'ba4'] // 列表未刪干凈
對示例1做點改動,
示例2:
bas = [ 'ba1', 'ba2', 'ba3', 'ba4', 'ba5' ]
for i in range( len( bas ) ) :
print( i )
print( bas[i] )
if ( bas[i].find( 'ba' ) != -1 ) :
del bas[i]
print( bas )
print( bas )上述代碼輸出如下:
0 ba1 ['ba2', 'ba3', 'ba4', 'ba5'] 1 ba3 ['ba2', 'ba4', 'ba5'] 2 ba5 ['ba2', 'ba4'] 3 Traceback (most recent call last): File "<stdin>", line 3, in <module> IndexError: list index out of range ['ba2', 'ba4']
循環(huán)變量i只遞增到3,進而拋出IndexError。
該坑的起因是,for循環(huán)中i的取值從最開始就固定了,實際上要求list在for循環(huán)中保持不變;遍歷list的過程中動態(tài)刪除元素,導致list發(fā)生變化,而i仍固執(zhí)地按原計劃遞增遍歷list,于是漏刪元素、索引越界。
對此,wzhvictor給了5種解決方案。
方式1,利用filter函數(shù)
bas = [ 'ba1', 'ba2', 'ba3', 'ba4', 'ba5', 'tk' ] bas = list( filter( lambda ba:ba.find( 'ba' ) == -1, bas ) ) print( bas )
方法2,重新構造list
bas = [ 'ba1', 'ba2', 'ba3', 'ba4', 'ba5', 'tk' ] bas = [ba for ba in bas if ba.find( 'ba' ) == -1] print( bas )
方法3,遍歷list的拷貝,對原始list進行刪除操作
bas = [ 'ba1', 'ba2', 'ba3', 'ba4', 'ba5', 'tk' ]
for ba in bas[:] :
if ( ba.find( 'ba' ) != -1 ) :
bas.remove( ba )
print( bas )方法4
bas = [ 'ba1', 'ba2', 'ba3', 'ba4', 'ba5', 'tk' ]
for ba in bas[:] :
if ( ba.find( 'ba' ) != -1 ) :
bas.remove( ba )
print( bas )方法5,倒序遍歷
bas = [ 'ba1', 'ba2', 'ba3', 'ba4', 'ba5', 'tk' ]
for i in range( len( bas )-1, -1, -1 ) :
if ( bas[i].find( 'ba' ) != -1 ) :
del bas[i]
print( bas )就tk的示例1而言,方法4其實不適用,方法4適合從list中刪除所有特定值。
這個坑我沒踩過,用過方法2、3、4或者它們的變種。沒像wzhvictor那樣細究過for循環(huán)中i取值從最開始就固定,但我本能地對循環(huán)中動態(tài)處理的對象不放心,又懶得看Python文檔,所以要么重新構造list,要么復制list再操作,完美避坑。今日看了wzhvictor的文章,方法1沒用過,方法5沒想過,方法5比較騷包,我第一次見。
Python表面上的不確定性真多,也沒啥大不了,我的經(jīng)驗是,能用簡明直觀確定性的寫法,就不要騷包玩花活,性能優(yōu)化是后話。再就是,單元測試,無需再多強調。
到此這篇關于Python遍歷列表時刪除元素案例的文章就介紹到這了,更多相關Python遍歷列表內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python的CGIHTTPServer交互實現(xiàn)詳解
本篇文章主要給大家詳細分析了Python的CGIHTTPServer交互實現(xiàn)過程以及相關代碼分享,有興趣的參考學習下。2018-02-02
tkinter如何實現(xiàn)打開文件對話框并獲取文件絕對路徑
這篇文章主要介紹了tkinter實現(xiàn)打開文件對話框并獲取文件絕對路徑問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01
python圖的深度優(yōu)先和廣度優(yōu)先算法實例分析
這篇文章主要介紹了python圖的深度優(yōu)先和廣度優(yōu)先算法,結合實例形式分析了圖的深度優(yōu)先算法與廣度優(yōu)先算法相關概念、原理、實現(xiàn)技巧與操作注意事項,需要的朋友可以參考下2019-10-10
Scrapy模擬登錄趕集網(wǎng)的實現(xiàn)代碼
這篇文章主要介紹了Scrapy模擬登錄趕集網(wǎng)的實現(xiàn)代碼,本文通過代碼圖文相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07

