python3 list 使用 for 遍歷,邊循環邊刪除問題


今天由於要對一個 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 循環的消耗,小編認為一定還有更好的方法,待小編去詢問大神之后,再來更新這篇文檔,如果有各位朋友有更好的辦法,也可以在評論區告訴小編 ~


免責聲明!

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



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