1. 程式人生 > >python list 使用remove刪除元素會遇到的坑

python list 使用remove刪除元素會遇到的坑

python中使用list的時候,通常需要用到移除其中某些元素,而remove函式就正好可以移除元素,所以就會想到迴圈遍歷list,利用remove函式移除元素,例如下面一段程式碼:

def remove_item(l,n):
    for item in l:
        if item==n:
            l.remove(item)
if __name__ == "__main__":
    l = [1,2,3,3,3]
    print("before remove l:",l)
    remove_item(l,3)
    print("after remove l:",l)

上面的一段程式碼期望實現的是刪除list中等於3的元素,執行結果為:

刪除之後仍然還有元素3,並沒有完全刪除,所以這種方法是有問題的,那麼問題在哪呢?

那是因為list的遍歷是基於下標的,當你刪除其中的一個元素的時候,列表實際上已經發生了變化,該元素後面的所有元素都往前移動了一個位置,所以下次遍歷的時候就會跳過該元素後面的一個元素,例子中的第二個3就被跳過了,這個3去填了移除的那個3的位置,所以第二個3不會被移除。

解決辦法:方法很多,比如可以把不刪除的元素重新新增到一個新的list中,也可以先拷貝一份列表備份,然後遍歷備份列表,刪除的時候就刪除原列表,再或者基於索引遍歷,當需要刪除元素的時候,索引值對應減1,這些方法都可以根據自己需求選擇。

相關推薦

python list 使用remove刪除元素遇到的

python中使用list的時候,通常需要用到移除其中某些元素,而remove函式就正好可以移除元素,所以就會想到迴圈遍歷list,利用remove函式移除元素,例如下面一段程式碼:def remove

Python3基礎 list remove 刪除元素

markdown list 理解 跨平臺 解釋 -- rule download coder ? python : 3.7.0 OS : Ubuntu 18.04.1 LTS

關於List集合remove刪除元素的問題

 執行如下程式碼: public static void test1(){ List<String> list = new ArrayList<String>(); list.add("abc"); list.add("abc"); list.add

pythonList新增,刪除元素的幾種方法

python中List新增元素的幾種方法 List 是 Python 中常用的資料型別,它一個有序集合,即其中的元素始終保持著初始時的定義的順序(除非你對它們進行排序或其他修改操作)。 在Python中,向List新增元素,方法有如下4種方法(append(),extend(),insert()

list刪除元素的方法:pop(x)和remove(x)

簡單總結一下: list.remove(x)中的引數是列表中元素,即刪除某個元素;list.pop([i])中的i是列表中元素的索引值,這個i用放括號包裹起來,意味著還可以不寫任何索引值,如上面操作結果,就是刪除列表的最後一個。 給看官留下一個思考題,如果要像前面那樣,能

Java 中list(ArrayList)的foreach遍歷方式呼叫listremove刪除元素,不丟擲ConcurrentModificationException

關於list刪除元素的當時有很多,具體可以參考下面這個部落格。 https://blog.csdn.net/claram/article/details/53410175 裡面提到了list的foreach遍歷方式刪除元素,會丟擲ConcurrentMo

List刪除 元素

class 取出 iterator dto min iter clas HA ati 從List 中 取出元素, 小於1000 的去除 其他便利 remove 會報錯 public static List<OrderReminderDTO> checkRe

python 原生列表刪除元素方法總結

inf ima 技術 image rem move 方法 .com pytho 一、列表方法remove(),按值刪除,刪除首個符合的元素 二、列表方法pop(),按索引刪除,默認刪除最後一個元素 三、del函數,刪除

JAVA基礎第四章-集合框架Collection篇 JAVA基礎第一章-初識java JAVA基礎第二章-java三大特性:封裝、繼承、多型 JAVA基礎第三章-類與物件、抽象類、介面 記一次list迴圈刪除元素的突發事件!

 業內經常說的一句話是不要重複造輪子,但是有時候,只有自己造一個輪子了,才會深刻明白什麼樣的輪子適合山路,什麼樣的輪子適合平地! 我將會持續更新java基礎知識,歡迎關注。   往期章節: JAVA基礎第一章-初識java JAVA基礎第二章-java三大特性

[work] python list補齊元素

list2 += [None for i in range(len(list1)-len(list2))] In [194]: l1 = range(5) In [195]: l2 = range(2) In [196]: l2.extend(["null"]*(len(l

C#遍歷List刪除元素的方法概述

1、使用foreach遍歷並刪除元素 因為在foreach中刪除元素時,每一次刪除都會導致集合的大小和元素索引值發生變化,從需導致在foreach中刪除元素會出現異常。 2、使用for遍歷

遍歷List集合刪除元素的出現報錯

遍歷List集合刪除元素的出現報錯   遍歷List集合刪除元素的時候會發生索引越界異常或內容遍歷不全等問題。 例子: List<String> al = new ArrayList<String>();    al.

python os.remove刪除檔案(檢查是否被佔用,處理被佔用無法刪除時的系統報錯)

import os dhvideopath = r'C:\RecordDownload' aa = os.path.exists(r'C:\RecordDownload\NVR_ch1_main_20171231230001_20180101000001.asf') bb

java中ArrayList使用remove刪除元素時幾種常見的問題及解決辦法

一,for迴圈使用remove()刪除座標來刪除元素。 問題現象:迴圈的時候被刪除元素的下個元素不能讀取到。程式碼現象如下: List<String> testList1 = new ArrayList<Stri

List正確刪除元素方法

個人總結:有意思,for 原理是Iterator實現,如果你只是刪除List裡面元素,會導致Iterator判斷hasnext時數量不同而報錯。這個是使用ArrayList.remove(Object xx)的方法。 正確是使用Iterator的remive()方法來刪除

為什麼ArrayList在使用迭代器迭代元素時不能使用List.remove()刪元素,而是使用Iterator.remove()刪元素

其實,我相信有一定經驗的都已經知道了,把標題的“為什麼”去掉讀一遍,但是具體是為什麼?今天本人跟進原始碼(jdk7)探了個究竟。注:這篇文章只介紹使用list.remove()丟擲ConcurrentModificationException的原因,其它引數及異常不作介紹。直

遍歷list刪除元素的正確做法

我們往往會遇到需要刪除list中滿足條件的元素。舉例: List<string> list_str =new List<string>() { "A","B","B",

python list刪除元素是要注意的

我們直接先給出輸出與預期不同的程式碼 In[28]: a = [1,2,3,4,5,6] In[29]: for i in a: ...: a.remove(i) ...: In[30]: a Out[30]: [2, 4,

for循環裏面不要進行remove操作,for循環裏remove元素後,list的下標減小,導致遍歷不完全

body 代碼 2.0 class equals tostring arraylist 執行 align p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: justify; font: 12.0px "Helvetica