Python语法糖——遍历列表时删除元素
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發起任何形式的遍歷時,它的遍歷順序都是從最初就確定的,而在遍歷中刪除了元素會導致當前索引的變化,這樣一是會導致漏刪元素,二是會導致遍歷超過鏈表的長度。
所以遍歷一個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循環來搞定,每次循環都先會判斷 0 是否在列表中
while 0 in lst:lst.remove(0) print lst方法五:倒序循環遍歷
for item in range(len(lst) - 1, -1, -1):if lst[item] == 0:del lst[item] print lst倒序是最geek的解決辦法,但是倒序的代碼可讀性差,推薦用filter,這樣寫出來的代碼更Pythonic。
總結
以上是生活随笔為你收集整理的Python语法糖——遍历列表时删除元素的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据算法与结构基本知识
- 下一篇: Python环境下,提高pip安装库速度