最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言

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

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的實際長度變小了,但是循環(huán)次數(shù)沒有減少,依然按照原來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)

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

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

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

思考了下,知道了原因,當符合條件,刪除元素[2]之后,后面的元素全部往前移,于是[3, 4, 5]向前移動,那么元素[3]的索引,就變成了之前[2]的索引(現(xiàn)在[3]的下標索引變?yōu)?了),后面的元素以此類推??墒?,下一次for循環(huán)的時候,是從下標索引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)不行,那就換個思路,用while循環(huán)來搞定。每次while循環(huán)的時候,都會去檢查list的長度(i < len(num_list)),這樣,就避免了索引溢出,然后,在符合條件,刪除元素[2]之后,手動把當前下標索引-1,以使下一次循環(huán)的時候,通過-1后的下標索引取出來的元素是[3],而不是略過[3]。

當然,這還不是最優(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)時刪除就有問題,而倒序循環(huán)時刪除就ok?額。。。。。。言語難表,還是畫個丑圖出來吧。

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

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

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

刪除元素[2]后,[3, 4, 5]往前擠,但是沒關(guān)系,因為下一次循環(huán)的下標索引為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中的元素,則既不會引起索引溢出,最后又能夠得到想要的最終結(jié)果。此方法的缺點可能是,對于過大的list,拷貝后可能很占內(nèi)存。那么對于這種情況,可以用倒序遍歷的方法來實現(xiàn)。

總結(jié)

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

相關(guān)文章

  • python2.7和NLTK安裝詳細教程

    python2.7和NLTK安裝詳細教程

    這篇文章主要為大家詳細介紹了python2.7和NLTK安裝詳細教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • 詳解Python3序列賦值、序列解包

    詳解Python3序列賦值、序列解包

    這篇文章主要介紹了Python3序列賦值、序列解包的相關(guān)知識,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-05-05
  • Django框架實現(xiàn)的簡單分頁功能示例

    Django框架實現(xiàn)的簡單分頁功能示例

    這篇文章主要介紹了Django框架實現(xiàn)的簡單分頁功能,在之前一篇留言板之上增加了簡單分頁功能,涉及Paginator模塊的簡單使用技巧,需要的朋友可以參考下
    2018-12-12
  • python 代碼實現(xiàn)k-means聚類分析的思路(不使用現(xiàn)成聚類庫)

    python 代碼實現(xiàn)k-means聚類分析的思路(不使用現(xiàn)成聚類庫)

    這篇文章主要介紹了python 代碼實現(xiàn)k-means聚類分析(不使用現(xiàn)成聚類庫),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • Python教程使用Chord包實現(xiàn)炫彩弦圖示例

    Python教程使用Chord包實現(xiàn)炫彩弦圖示例

    在可視化中,有時候會使用到弦圖(Chord Diagram)來表示事物之間關(guān)系,本篇文章教大家如何使用Chord包實現(xiàn)炫彩弦圖,有需要的朋友可以借鑒參考下,希望大家多多進步,早日升職加薪
    2021-09-09
  • Django如何使用redis作為緩存

    Django如何使用redis作為緩存

    這篇文章主要介紹了Django如何使用redis作為緩存,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • python gdal安裝與簡單使用

    python gdal安裝與簡單使用

    這篇文章主要介紹了python gdal安裝與簡單使用,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • 詳解使用pymysql在python中對mysql的增刪改查操作(綜合)

    詳解使用pymysql在python中對mysql的增刪改查操作(綜合)

    本篇文章主要介紹了使用pymysql在python中對mysql的增刪改查操作,通過pymysql向數(shù)據(jù)庫進行查刪增改,具有一定的參考價值,有興趣的可以了解一下。
    2017-01-01
  • Python實現(xiàn)在某個數(shù)組中查找一個值的算法示例

    Python實現(xiàn)在某個數(shù)組中查找一個值的算法示例

    今天小編就為大家分享一篇Python實現(xiàn)在某個數(shù)組中查找一個值的算法示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • python偏函數(shù)的實例用法總結(jié)

    python偏函數(shù)的實例用法總結(jié)

    在本篇文章里小編給大家整理的是一篇關(guān)于python偏函數(shù)的實例用法總結(jié)內(nèi)容,有興趣的朋友們可以跟著學習參考下。
    2021-07-07

最新評論

高青县| 韩城市| 红安县| 广安市| 宣武区| 靖边县| 乌鲁木齐市| 衡阳市| 茌平县| 阿拉善右旗| 电白县| 奇台县| 大新县| 梧州市| 佛冈县| 海南省| 远安县| 比如县| 霸州市| 乌拉特前旗| 万载县| 宁津县| 石狮市| 来安县| 宁蒗| 定安县| 扶沟县| 石楼县| 高台县| 莎车县| 中山市| 嘉荫县| 吉隆县| 辰溪县| 香河县| 鄂州市| 庆阳市| 黑龙江省| 堆龙德庆县| 凤山县| 什邡市|