1、使用場景#####
現在有一個list,其中存儲有我們想要的元素和我們想要刪除的元素,如何實現一邊遍歷列表一邊刪除滿足條件的元素。
例:######
list_demo = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
我想要一邊遍歷列表,一邊將所有元素刪除。
2、遇到問題#####
開始我使用了最容易想到的方法就是:
for item in list_demo:
item.remove(item)
但是輸出結果卻是這樣的:
Microsoft Windows [版本 10.0.14393]
(c) 2016 Microsoft Corporation。保留所有權利。
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]
>>>
從上面輸出結果可以看出來只是刪除了1、3、4、5、7、9。好象是每刪除一個就跳過了一個。
3、解決問題#####
我簡單畫圖分析了一下。
------------------------------
|1 | 2 | 3 | 4 | 5 |....| 10 |
-------------------------------
(只是個人見解)######
當遍歷第一個元素時,刪除了下標為0的元素,當遍歷下標為1的元素時,后面的元素會向前移動一個位置,就是元素2移動到了原來元素1的位置,但是此時已經準備刪除下標為1的元素,這樣就將元素2跳過去了,以此類推,所有偶數元素都沒有被刪除。
方法一:
使用從后向前刪除就不會有這樣的情況了。
for temp in range(len(list_demo)-1, -1, -1):
list_demo.pop(temp)
運行結果如下:
Microsoft Windows [版本 10.0.14393]
(c) 2016 Microsoft Corporation。保留所有權利。
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)
運行結果如下:
Microsoft Windows [版本 10.0.14393]
(c) 2016 Microsoft Corporation。保留所有權利。
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
[]
>>>
這種方法有一定的代價,如果列表很大,使用拷貝,將會將列表讀取到內存中,大列表會很占內存空間,所以如果數據量大不建議使用這種方法。
END