2017-02-13 41 views
2

當我試圖刪除元素的所有元素通過循環是這樣的:廣東話刪除通過pop方法

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 12, 122] 
for z in numbers: 
    a = numbers.pop(0) 
print(numbers) 

這就是我得到:

[8, 9, 10, 18, 12, 122] 

爲什麼它不刪除所有元素?爲什麼? 謝謝!

+2

爲你迭代 –

+0

'在數z不要修改列表[:]:'應該工作。 –

+1

@KlausD:可能更好的方法是將範圍放在'len(..)'上,因爲這需要更少的內存。 –

回答

4

您的代碼將刪除一半。因爲當你使用for循環時,它將迭代元素。現在移除列表另一側的元素,這樣兩個指針將在中途到達彼此,因此循環將停止。

所以,你開始的列表:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 12, 122] 
#^ 

*(插入符號表示在for循環指針所在的位置),接下來你彈出和推進尖號:

[2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 12, 122] 
# ^

等:

[4, 5, 6, 7, 8, 9, 10, 18, 12, 122] 
# ^
[5, 6, 7, 8, 9, 10, 18, 12, 122] 
#  ^
[6, 7, 8, 9, 10, 18, 12, 122] 
#   ^
[7, 8, 9, 10, 18, 12, 122] 
#    ^
[8, 9, 10, 18, 12, 122] 
#     ^

現在索引指針到達一個點超出該範圍時,因此循環終止。但是它並沒有重複所有的元素:因爲每次你彈出一個元素,它就立即跳了兩步就這麼說。

約遍歷列出了一些一般性的建議:

您做的更好修改列表,而你遍歷它。

一個更好的辦法來做到這一點是:

for _ in range(len(numbers)): 
    a = numbers.pop(0) 
print(numbers)

,或者爲@Matthias提出:

while numbers: 
    a = numbers.pop(0) 
print(numbers)

由於列表bool(..)是真的包含至少一個元件。所以這裏每次我們檢查numbers中是否至少還有一個元素。

+0

其實OP從開始刪除('.pop(0)'),而不是結束... –

+0

@brunodesthuilliers:我剛剛注意到。編輯... –

+0

'list.pop(0)'是O(n),我不認爲這是很好的建議,以這種方式使用它。此問題的核心顯然是一個騙局 –