中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在Python中循環遍歷刪除list數據

發布時間:2021-05-12 17:58:46 來源:億速云 閱讀:220 作者:Leah 欄目:開發技術

本篇文章給大家分享的是有關怎么在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數據

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

2)倒序循環時刪除

怎么在Python中循環遍歷刪除list數據

刪除元素[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,拷貝后可能很占內存。那么對于這種情況,可以用倒序遍歷的方法來實現。

python是什么意思

Python是一種跨平臺的、具有解釋性、編譯性、互動性和面向對象的腳本語言,其最初的設計是用于編寫自動化腳本,隨著版本的不斷更新和新功能的添加,常用于用于開發獨立的項目和大型項目。

以上就是怎么在Python中循環遍歷刪除list數據,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

手游| 保定市| 郓城县| 鹤峰县| 阿图什市| 同德县| 澄迈县| 泌阳县| 垣曲县| 密山市| 太康县| 酉阳| 陈巴尔虎旗| 泽普县| 台东市| 利川市| 澄江县| 哈密市| 深泽县| 治多县| 达州市| 鹤壁市| 芦溪县| 乌审旗| 安塞县| 合江县| 桓台县| 克什克腾旗| 额敏县| 平邑县| 鲁甸县| 敖汉旗| 西平县| 定日县| 克什克腾旗| 瑞丽市| 清河县| 江永县| 黔江区| 会泽县| 岐山县|