刪除list中元素的問題

2021-06-22 10:40:53 字數 1140 閱讀 8507

先來看乙個例子:

lst = [x for x in xrange(10)];

print(lst)

for x in lst:

lst.remove(x)

print(lst)

結果為:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

[1, 3, 5, 7, 9] #為啥沒有被刪除乾淨呢?

檢視python源**:

python-2.7.5\objects\listobject.c 【python中list的實現**】

remove方法對應的**如下:

static pyobject *

listremove(pylistobject *self, pyobject *v)

else if (cmp < 0)

return null;

}pyerr_setstring(pyexc_valueerror, "list.remove(x): x not in list");

return null;

}

**邏輯比較簡單,先查詢是否存在要被remove的元素,如果存在多個相同的值,只remove第乙個被找到的元素。

找到之後,就呼叫list_ass_slice(self, i, i+1,

(pyobject *)null) == 0

再看這個list_ass_slice函式中乾了什麼,如下片段:

if (d < 0)
原來是將要被刪除之後的所有元素向前移動。

這就能解釋為啥開始的例子中,遍歷remove後,仍然還有元素沒有remove掉了。因為remove掉2之後,元素3跑到了2的位置,下乙個被遍歷的就變成4了。

ps:python的list本身就是乙個指標陣列:

typedef struct  pylistobject;

總結:1、如果要刪除list中的所有元素,可以使用clear方法;

2、不建議刪除list中的部分元素,因為需要移動被刪除元素後面的所有元素,效率比較低;

可以將需要刪除的元素置為none,後續處理時過濾掉none即可。

List集合中元素的問題

檢視 bookbeans 是原始集合,memberbeans 是根據bookbeans集合 是把集合元素插入進來生成的,adapter中元素是memberbeans 所以當修改了memberbeans集合中元素屬性的時候,bookbeans集合元素屬性跟隨改變,adapter在更新 的時候也會看到 ...

python刪除list中元素的三種方法

a.pop index 刪除列表a中index處的值,並且返回這個值.del a index 刪除列表a中index處的值,無返回值.del中的index可以是切片,所以可以實現批量刪除.a.remove value 刪除列表a中第乙個等於value的值,無返回.a 0,2,3,2 a.remove...

List刪除元素

1.首先list刪除元素是不能用增強for語句 foreach 的,因為增強for語句主要是用來查詢的。雖然也可以用迭代器iterator來刪除,但本人建議最好還是用普通for迴圈來刪除。2.list空間是存在於快取中的,從資料庫中取來的資料放在list中,然後進行刪除,這刪除的是快取中的資料並不會...