今天由於要對一個 list 數據類型寫一個循環刪除的程序(這是小編第一次對於 list 操作),但發現一個奇異問題,來,我們來看看代碼跟效果:
1 # 初始化一個 list 列表,為了下邊的方便比較,我就使用跟 list 索引來做 list 的元素 2 datas = [0,1,2,3,4] 3 4 # 打印元素組,方便比較 5 print(datas) 6 7 #使用 for 遍歷 8 for data in datas: 9 10 # 刪除 list 中的元素 11 datas.remove(data) 12 13 # 打印刪除后的數組 14 print(datas)
我們來看這一段代碼,最后的輸出結果,按照我以前的經驗,應該是一個空的 [] ,但結果不是:
上面的結果卻告訴我們,上面的程序只刪除了三個元素,並沒有全部刪除完,為什么呢?從上面的結果中,我們可以看出,刪除的元素是 1,3,5,從這我們可以看出,原來,是 list 在 for 循環中的索引問題,我們來實時跟蹤一下 list 列表在 for 中的變化:
1 # 初始化一個 list 列表,為了下邊的方便比較,我就使用跟 list 索引來做 list 的元素 2 datas = [0,1,2,3,4] 3 4 # 打印元素組,方便比較 5 print(datas) 6 7 # 記錄是第幾次 for 循環 8 index = 1 9 10 # 記錄 datas 當前循環的下標值 11 i = 0 12 13 #使用 for 遍歷 14 for data in datas: 15 16 # 打印循環次數 17 print('\n這是第 %d 次循環,datas 當前在 for 循環中的下標值為:%d,刪除前 datas 的元素為:' %(index, i)) 18 19 # 實時打印 datas 列表 20 print(datas) 21 22 # 刪除 list 中的元素 23 datas.remove(data) 24 25 26 # 循環次數+1 27 index += 1 28 29 # 索引 +1 30 i += 1 31 32 # 最后的 datas 列表 33 print('\n循環結束,最后的 datas 的元素為:') 34 print(datas)
輸出結果如下:
如上圖可以看出,在 for 循環中 datas 沒刪除一個元素,它的索引都會變化,但 for 循環中遍歷的索引,總會加 1 ,所以,就會出現以上這種跳過性刪除的情況。對於這種情況,小編自己想到了一個方法,我們先來看看下面的這一段程序:
1 # 初始化一個 list 列表 2 datas = [1,3,4,10,5,3,7,6,9,8] 3 4 #使用 for 遍歷 5 for data in datas: 6 7 # 現在我們需要刪除偶數的元素 8 if data % 2 == 0: 9 10 # 刪除 datas 中的元素 11 datas.remove(data) 12 13 # 最后的 datas 列表 14 print('\n循環結束,最后的 datas 的元素為:') 15 print(datas)
我們來看看這段代碼的運行結果:
我們可以看出,4 跟 10 是相鄰着的,4 的下標是 2,10 的下標是 3,所以當 4 刪除之后,datas 中下標為 2 的元素就變成了 10,但是,此時的 for 循環中,datas 的下標是 3 了,所以取不了 10 這個元素,這才導致了 10 沒有被刪除。那我們要如何來刪除呢?小編的做法是這樣的:
1 # 初始化一個 list 列表 2 datas = [1,3,4,10,5,3,7,6,9,8] 3 4 # 打印原數組元素,方便對比 5 print('原 datas 列表的元素為:') 6 print(datas) 7 8 # 定義一個空的 list 列表,來儲存要刪除的 datas 的元素 9 datas_del = [] 10 11 #使用 for 遍歷 12 for data in datas: 13 14 # 現在我們需要刪除偶數的元素 15 if data % 2 == 0: 16 17 # 不直接刪除,將需要刪除的元素,存入 datas_del 中 18 datas_del.append(data) 19 20 # 打印 datas_del 列表,查看要刪除的元素 21 print('\n打印 datas_del 列表,查看要刪除的元素') 22 print(datas_del) 23 24 # 再執行一個 for 循環,遍歷 datas_del 列表 25 for data in datas_del: 26 27 # 刪除 datas 中的元素 28 datas.remove(data) 29 30 # 最后的 datas 列表 31 print('\n刪除后的 datas 的元素為:') 32 print(datas)
現在我們來執行以下上面的這段代碼,是否已經可以成功的刪除所要刪除的元素,我們看看結果:
從上面的結果可知,我們已經成功的將我們所需要的元素刪除了,這就是小編自己想到的方法。
注:小編覺得這個方法不好,因為多了一個 for 循環的消耗,小編認為一定還有更好的方法,待小編去詢問大神之后,再來更新這篇文檔,如果有各位朋友有更好的辦法,也可以在評論區告訴小編 ~