Python如何一邊遍歷列表一邊刪除數(shù)據(jù)

1、使用場景#####
現(xiàn)在有一個list,其中存儲有我們想要的元素和我們想要刪除的元素,如何實現(xiàn)一邊遍歷列表一邊刪除滿足條件的元素。
例:######
list_demo = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

我想要一邊遍歷列表,一邊將所有元素刪除。

2、遇到問題#####

開始我使用了最容易想到的方法就是:

for item in list_demo:
    item.remove(item)

但是輸出結(jié)果卻是這樣的:

Microsoft Windows [版本 10.0.14393]
(c) 2016 Microsoft Corporation。保留所有權(quán)利。

C:\Users\foolf>python
Python 2.7.12 (v2.7.12:d33e0cf91556, Jun 27 2016, 15:24:40) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> list_demo = [1,2,3,4,5,6,7,8,9,10]
>>> for item in list_demo:
...     list_demo.remove(item)
...
>>>
>>> list_demo
[2, 4, 6, 8, 10]
>>>

從上面輸出結(jié)果可以看出來只是刪除了1、3、4、5、7、9。好象是每刪除一個就跳過了一個。

3、解決問題#####

我簡單畫圖分析了一下。

------------------------------
|1  | 2 | 3 | 4 | 5 |....| 10 |
-------------------------------
(只是個人見解)######

當(dāng)遍歷第一個元素時,刪除了下標(biāo)為0的元素,當(dāng)遍歷下標(biāo)為1的元素時,后面的元素會向前移動一個位置,就是元素2移動到了原來元素1的位置,但是此時已經(jīng)準(zhǔn)備刪除下標(biāo)為1的元素,這樣就將元素2跳過去了,以此類推,所有偶數(shù)元素都沒有被刪除。
方法一:
使用從后向前刪除就不會有這樣的情況了。

for temp in range(len(list_demo)-1, -1, -1):
    list_demo.pop(temp)

運(yùn)行結(jié)果如下:

Microsoft Windows [版本 10.0.14393]
(c) 2016 Microsoft Corporation。保留所有權(quán)利。

C:\Users\foolf>python
Python 2.7.12 (v2.7.12:d33e0cf91556, Jun 27 2016, 15:24:40) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> list_demo = [1,2,3,4,5,6,7,8,9,10]

>>> for temp in range(len(list_demo)-1,-1,-1):
...     list_demo.pop(temp)
...
10
9
8
7
6
5
4
3
2
1
>>>

這樣就可以將所有元素邊遍歷邊刪除。
方法二:
先使用深拷貝獲取一份列表的拷貝,然后遍歷原來的列表。

new_list = list_demo[:]
for temp in new_list:
    list_demo.remove(temp)

運(yùn)行結(jié)果如下:

Microsoft Windows [版本 10.0.14393]
(c) 2016 Microsoft Corporation。保留所有權(quán)利。

C:\Users\foolf>python
Python 2.7.12 (v2.7.12:d33e0cf91556, Jun 27 2016, 15:24:40) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> list_demo = [1,2,3,4,5,6,7,8,9,10]
>>> new_list = list_demo[:]
>>> for temp in new_list:
...     list_demo.remove(temp)
...
>>> list_demo
[]
>>>

這種方法有一定的代價,如果列表很大,使用拷貝,將會將列表讀取到內(nèi)存中,大列表會很占內(nèi)存空間,所以如果數(shù)據(jù)量大不建議使用這種方法。
END

如果大家有什么好的方法,歡迎賜教。####

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容