亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python中l(wèi)ist循環(huán)遍歷刪除數(shù)據(jù)的正確方法

 更新時(shí)間:2019年09月02日 11:44:44   作者:bananaplan  
這篇文章主要給大家介紹了關(guān)于Python中l(wèi)ist循環(huán)遍歷刪除數(shù)據(jù)的正確方法,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

前言

初學(xué)Python,遇到過這樣的問題,在遍歷list的時(shí)候,刪除符合條件的數(shù)據(jù),可是總是報(bào)異常,代碼如下:

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)

會報(bào)異常:IndexError: list index out of range

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

于是我修改了代碼如下:

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)

這回不會報(bào)異常了,但是打印結(jié)果如下:

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

雖然最后,list中的元素[2]確實(shí)被刪除掉了,但是,在循環(huán)中的打印結(jié)果不對,少打印了[3]。

思考了下,知道了原因,當(dāng)符合條件,刪除元素[2]之后,后面的元素全部往前移,于是[3, 4, 5]向前移動(dòng),那么元素[3]的索引,就變成了之前[2]的索引(現(xiàn)在[3]的下標(biāo)索引變?yōu)?了),后面的元素以此類推??墒?,下一次for循環(huán)的時(shí)候,是從下標(biāo)索引2開始的,于是,取出了元素[4],就把[3]漏掉了。

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

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)

執(zhí)行結(jié)果,完全正確:

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

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

當(dāng)然,這還不是最優(yōu)解,所以,我搜索到了通用的解決方案:1、倒序循環(huán)遍歷;2、遍歷拷貝的list,操作原始的list。

1、倒序循環(huán):

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)

執(zhí)行結(jié)果完全正確。那么,為何正序循環(huán)時(shí)刪除就有問題,而倒序循環(huán)時(shí)刪除就ok?額。。。。。。言語難表,還是畫個(gè)丑圖出來吧。

1)正序循環(huán)時(shí)刪除:

刪除元素[2]之后,下一次循環(huán)的下標(biāo)索引為2,但此時(shí),里面存放的是[4],于是就把[3]給漏了。

2)倒序循環(huán)時(shí)刪除

刪除元素[2]后,[3, 4, 5]往前擠,但是沒關(guān)系,因?yàn)橄乱淮窝h(huán)的下標(biāo)索引為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,那么其實(shí),num_list[:]是對原始的num_list的一個(gè)拷貝,是一個(gè)新的list,所以,我們遍歷新的list,而刪除原始的list中的元素,則既不會引起索引溢出,最后又能夠得到想要的最終結(jié)果。此方法的缺點(diǎn)可能是,對于過大的list,拷貝后可能很占內(nèi)存。那么對于這種情況,可以用倒序遍歷的方法來實(shí)現(xiàn)。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對腳本之家的支持。

相關(guān)文章

  • 一篇文章帶你了解python中的typing模塊和類型注解

    一篇文章帶你了解python中的typing模塊和類型注解

    這篇文章主要為大家詳細(xì)介紹了python中的類型注解,使用typing模塊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • python編程使用selenium模擬登陸淘寶實(shí)例代碼

    python編程使用selenium模擬登陸淘寶實(shí)例代碼

    這篇文章主要介紹了python編程使用selenium模擬登陸淘寶實(shí)例代碼,涉及selenium的簡介及Windows下的安裝,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • 詳解Python開啟線程和線程池的方法

    詳解Python開啟線程和線程池的方法

    這篇文章主要介紹了Python開啟線程和線程池的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-03-03
  • pymongo為mongodb數(shù)據(jù)庫添加索引的方法

    pymongo為mongodb數(shù)據(jù)庫添加索引的方法

    這篇文章主要介紹了pymongo為mongodb數(shù)據(jù)庫添加索引的方法,涉及Python操作mongodb數(shù)據(jù)庫的相關(guān)技巧,非常簡單實(shí)用,需要的朋友可以參考下
    2015-05-05
  • Python中copy和deepcopy的使用分析

    Python中copy和deepcopy的使用分析

    這篇文章主要介紹了Python中copy和deepcopy的使用,淺拷貝等于賦值,也可以通過copy實(shí)現(xiàn),copy僅拷貝對象本身,deepcopy是真正意義上的復(fù)制,深拷貝,被復(fù)制對象完全復(fù)制一遍作為獨(dú)立的新個(gè)體,新開辟一塊空間,需要詳細(xì)了解的朋友可以參考下
    2021-10-10
  • Python利用socket實(shí)現(xiàn)多進(jìn)程的端口掃描器

    Python利用socket實(shí)現(xiàn)多進(jìn)程的端口掃描器

    作為開發(fā)人員經(jīng)常需要查看服務(wù)的端口開啟狀態(tài)判斷服務(wù)是否宕機(jī)。特別是部署的服務(wù)比較多的情況下,可能存在幾個(gè)甚至幾十個(gè)服務(wù)端口的占用。所以本文將利用socket實(shí)現(xiàn)多進(jìn)程的端口掃描器,需要的可以參考一下
    2022-12-12
  • Flask實(shí)現(xiàn)定制日志并輸出到文件

    Flask實(shí)現(xiàn)定制日志并輸出到文件

    這篇文章主要為大家學(xué)習(xí)介紹了Flask如何實(shí)現(xiàn)定制日志并輸出到文件,文中的示例代碼簡介易懂,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下吧
    2023-07-07
  • Qt5 實(shí)現(xiàn)主窗口狀態(tài)欄顯示時(shí)間

    Qt5 實(shí)現(xiàn)主窗口狀態(tài)欄顯示時(shí)間

    這篇文章主要介紹了Qt5 實(shí)現(xiàn)主窗口狀態(tài)欄顯示時(shí)間,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • python可視化text()函數(shù)使用詳解

    python可視化text()函數(shù)使用詳解

    這篇文章主要介紹了python可視化text()函數(shù)使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 如何使用Python實(shí)現(xiàn)斐波那契數(shù)列

    如何使用Python實(shí)現(xiàn)斐波那契數(shù)列

    這篇文章主要介紹了如何使用Python實(shí)現(xiàn)斐波那契數(shù)列,斐波那契數(shù)列(Fibonacci)最早由印度數(shù)學(xué)家Gopala提出,而第一個(gè)真正研究斐波那契數(shù)列的是意大利數(shù)學(xué)家 Leonardo Fibonacci,需要的朋友可以參考下
    2019-07-07

最新評論