欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Python中list循環遍歷刪除數據的正確方法

系統 2183 0

前言

初學Python,遇到過這樣的問題,在遍歷list的時候,刪除符合條件的數據,可是總是報異常,代碼如下:

            
num_list = [1, 2, 3, 4, 5]
print(num_list)

for i in range(len(num_list)):
 if num_list[i] == 2:
  num_list.pop(i)
 else:
  print(num_list[i])

print(num_list)
          

會報異常: IndexError: list index out of range

原因是在刪除list中的元素后,list的實際長度變小了,但是循環次數沒有減少,依然按照原來list的長度進行遍歷,所以會造成索引溢出。

于是我修改了代碼如下:

            
num_list = [1, 2, 3, 4, 5]
print(num_list)

for i in range(len(num_list)):
 if i >= len(num_list):
  break

 if num_list[i] == 2:
  num_list.pop(i)
 else:
  print(num_list[i])

print(num_list)
          

這回不會報異常了,但是打印結果如下:

[1, 2, 3, 4, 5]
1
4
5
[1, 3, 4, 5]
[Finished in 0.441s]

雖然最后,list中的元素[2]確實被刪除掉了,但是,在循環中的打印結果不對,少打印了[3]。

思考了下,知道了原因,當符合條件,刪除元素[2]之后,后面的元素全部往前移,于是[3, 4, 5]向前移動,那么元素[3]的索引,就變成了之前[2]的索引(現在[3]的下標索引變為1了),后面的元素以此類推。可是,下一次for循環的時候,是從下標索引2開始的,于是,取出了元素[4],就把[3]漏掉了。

把代碼修改成如下,結果一樣,絲毫沒有改觀:

            
num_list = [1, 2, 3, 4, 5]
print(num_list)

for item in num_list:
 if item == 2:
  num_list.remove(item)
 else:
  print(item)

print(num_list)
          

既然知道了問題的根本原因所在,想要找到正確的方法,也并不難,于是我寫了如下的代碼:

            
num_list = [1, 2, 3, 4, 5]
print(num_list)

i = 0
while i < len(num_list):
 if num_list[i] == 2:
  num_list.pop(i)
  i -= 1
 else:
  print(num_list[i])

 i += 1

print(num_list)
          

執行結果,完全正確:

[1, 2, 3, 4, 5]
1
3
4
5
[1, 3, 4, 5]
[Finished in 0.536s]

我的做法是,既然用for循環不行,那就換個思路,用while循環來搞定。每次while循環的時候,都會去檢查list的長度(i < len(num_list)),這樣,就避免了索引溢出,然后,在符合條件,刪除元素[2]之后,手動把當前下標索引-1,以使下一次循環的時候,通過-1后的下標索引取出來的元素是[3],而不是略過[3]。

當然,這還不是最優解,所以,我搜索到了通用的解決方案:1、倒序循環遍歷;2、遍歷拷貝的list,操作原始的list。

1、倒序循環:

            
num_list = [1, 2, 3, 4, 5]
print(num_list)

for i in range(len(num_list)-1, -1, -1):
 if num_list[i] == 2:
  num_list.pop(i)
 else:
  print(num_list[i])

print(num_list)
          

執行結果完全正確。那么,為何正序循環時刪除就有問題,而倒序循環時刪除就ok?額。。。。。。言語難表,還是畫個丑圖出來吧。

1)正序循環時刪除:

Python中list循環遍歷刪除數據的正確方法_第1張圖片

刪除元素[2]之后,下一次循環的下標索引為2,但此時,里面存放的是[4],于是就把[3]給漏了。

2)倒序循環時刪除

Python中list循環遍歷刪除數據的正確方法_第2張圖片

刪除元素[2]后,[3, 4, 5]往前擠,但是沒關系,因為下一次循環的下標索引為0,里面存放的是[1],所以正是我們所期望的正確的元素值。

2、遍歷拷貝的list,操作原始的list

            
num_list = [1, 2, 3, 4, 5]
print(num_list)

for item in num_list[:]:
 if item == 2:
  num_list.remove(item)
 else:
  print(item)

print(num_list)
          

原始的list是num_list,那么其實,num_list[:]是對原始的num_list的一個拷貝,是一個新的list,所以,我們遍歷新的list,而刪除原始的list中的元素,則既不會引起索引溢出,最后又能夠得到想要的最終結果。此方法的缺點可能是,對于過大的list,拷貝后可能很占內存。那么對于這種情況,可以用倒序遍歷的方法來實現。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 婷婷色香五月激情综合2020 | 亚洲国产片高清在线观看 | 亚洲A片V一区二区三区有声 | 欧美激情a∨在线视频播放 中文字幕亚洲图片 | 激情伊人网 | 亚洲91精品 | 色草在线| 国产99一区二区 | 国产91高清在线 | 91传媒蜜桃香蕉在线观看 | 国产91久久精品一区二区 | 香蕉视频在线观看视频 | 亚洲zscs综合网站 | 奇米线在人线免费视频 | 免费高清成人啪啪网站 | 国产精品美女久久久久久久网站 | 亚洲视频免费 | 亚洲国产99在线精品一区二区 | 日本a级大片 | 色人阁网站| 国产精品免费观看视频 | 欧美日韩亚洲在线 | www.9cao | 天天爱天天做天天干 | 亚洲精品黄色 | 加勒比久久综合 | 午夜精品视频 | 欧美亚洲一区二区三区在线 | 爱爱视频天天干 | 鲁丝片一区二区三区免费 | 色婷婷精品综合久久狠狠 | 波多野结衣亚洲一区二区三区 | 国产福利福利视频 | 精品视频导航 | 成人情趣视频 | 日本不卡免费一区 | 欧美成年网站 | 男女视频在线 | 图片区乱熟图片区小说 | 国产欧美日韩视频 | 免费视频片在线观看大片 |