摘要:原因是用發(fā)起任何形式的遍歷時,它的遍歷順序都是從最初就確定的,而在遍歷中刪除了元素會導致當前索引的變化,這樣一是會導致漏刪元素,二是會導致遍歷超過鏈表的長度。所以遍歷一個時要刪除其中的部分元素就需要其他的解決方案。
Python的for可以遍歷一個List,但是在遍歷的過程中刪除元素常常會得到意想不到的結果甚至程序出現異常,例如:
lst = [1, 1, 0, 2, 0, 0, 8, 3, 0, 2, 5, 0, 2, 6] for item in lst: if item == 0: lst.remove(item) print lst
輸出: [1, 1, 2, 8, 3, 2, 5, 0, 2, 6]
這段代碼的本意是想刪除列表中元素為 0 的項,但實際跑起來并不是那個結果。
再看下面這個例子,利用索引來遍歷刪除列表中的元素:
for item in range(len(lst)): if lst[item] == 0: del lst[item] print lst
輸出: IndexError: list index out of range
這時候就報錯了,拋出了數組下標越界的異常。原因是用for發(fā)起任何形式的遍歷時,它的遍歷順序都是從最初就確定的,而在遍歷中刪除了元素會導致當前索引的變化,這樣一是會導致漏刪元素,二是會導致遍歷超過鏈表的長度。
所以遍歷一個List時要刪除其中的部分元素就需要其他的解決方案。
方法一:可以使用filter過濾返回新的List
lst = [1, 1, 0, 2, 0, 0, 8, 3, 0, 2, 5, 0, 2, 6] lst = filter(lambda x: x != 0, lst) print lst
這樣可以安全刪除列表中值為 0 的元素了,filter包括兩個參數,分別是function和list,filter把傳入的函數依次作用于每個元素,然后根據返回值是True還是False來決定是保留還是丟棄該元素。
方法二:列表解析
lst = [x for x in lst if x != 0] print lst
方法三:或者遍歷拷貝的List,操作原始的List
for item in lst[:]: if item == 0: lst.remove(item) print lst
方法四:用while循環(huán)來搞定,每次循環(huán)都先會判斷 0 是否在列表中
while 0 in lst: lst.remove(0) print lst
方法五:倒序循環(huán)遍歷
for item in range(len(lst) - 1, -1, -1): if lst[item] == 0: del lst[item] print lst
倒序是最geek的解決辦法,但是倒序的代碼可讀性差,推薦用filter,這樣寫出來的代碼更Pythonic。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/38218.html
摘要:最終還是要寫上足夠量的代碼,才會有悟道的那一刻。另外,對于代碼本身,有一套書寫規(guī)范,叫做。 Python 里有個小彩蛋: 在 Python Shell 里輸入 import this showImg(https://segmentfault.com/img/remote/1460000018394156?w=600&h=463); 這段話被稱作 Python 之禪 ( The Zen ...
摘要:內置函數實現對可迭代對象進行進一步處理。文件文件的打開權限打開文件,文件不存在報異常寫入文件,文件不存在則創(chuàng)建。文件不存在則創(chuàng)建。追加文件,具有讀寫權限。 Python基礎類型: 1.Tuple元組,內容不可改變,但是允許元素內部存在list等類型的元素,并且允許改變列表的值,所謂內容不可變指的是在內存中指向的地址是不變的。 temp=(1,2,[3,4]) temp[-1]....
摘要:一字典定義字典獲取元素這兩個的區(qū)別用在不存在的時候不會拋出設置當不存在的時候返回的內容增加和修改元素修改和增加元素的方法都是這個刪除元素刪除的同時返回刪除的內容如果刪除不存在的會報這個時候就需要給定返回值這樣返回的就是不會報錯誤從字典中隨機 一.字典: 定義字典:d = {}d = dict()d = {a:1, b:2} 1.獲取元素: d[a] d.get(a) >這兩個的區(qū)別,用...
摘要:列表是編程中使用頻率極高的數據結構,由一系列按特定順序排列的元素組成,用表示,逗號分隔元素,類似中的數組。由于列表包含多個元素,所以通常命名為復數形式,如,等。使用切片裁剪獲取子列表使用列表名裁剪獲取對應索引區(qū)間的子列。 前言: 好久不見,突然發(fā)覺好久沒寫博客了,最近迷上了 Python 無法自拔,了解了一下,Python 簡單易學,尤其是接觸過 java 的人,入門 Python 更...
摘要:本文是對于現代開發(fā)語法基礎與工程實踐的總結,更多相關資料參考學習與實踐資料索引本文參考了,等。 showImg(https://segmentfault.com/img/remote/1460000012129659); 本文是對于 現代 Python 開發(fā):語法基礎與工程實踐的總結,更多 Python 相關資料參考 Python 學習與實踐資料索引;本文參考了 Python Cras...
閱讀 3255·2021-11-18 10:02
閱讀 1960·2021-09-22 10:54
閱讀 2997·2019-08-30 15:43
閱讀 2588·2019-08-30 13:22
閱讀 1586·2019-08-29 13:57
閱讀 1055·2019-08-29 13:27
閱讀 746·2019-08-26 14:05
閱讀 2532·2019-08-26 13:30