要遍歷列表時,回答的第一個問題,其原因,內部的Python跟蹤在其當前迭代已經達到了,當你從列表中刪除項目的索引,它改變了元素的索引,後將被移除的元素向左移1(將這些索引減1),因此在下一次迭代中,最終可能會跳過一個元素(因爲這種移位)。
爲了回答第二個問題,它應該比去除方法更快,因爲.remove()
是O(n)的操作,其中它需要找到刪除,然後將其刪除的元件,相比,.append()
將快點。
更快一點的方法是使用列表理解 -
my_new_list = [m for m in my_list if 'blahblah' in m]
如果你想改變my_list
的地方,你可以在任務的左側使用[:]
-
my_list[:] = [m for m in my_list if 'blahblah' in m]
演示 -
>>> my_list = ['blahblah','asdas']
>>> [m for m in my_list if 'blahblah' in m]
['blahblah']
時序比較EEN兩種方法(如在意見中的要求) -
In [4]: def func1():
...: my_list = ['blahblah' for _ in range(100)]
...: my_list[:] = [m for m in my_list if 'blahblah' in m]
...:
In [5]: def func2():
...: my_list = ['blahblah' for _ in range(100)]
...: new_list = [m for m in my_list if 'blahblah' in m]
...:
In [6]: %timeit func1()
100000 loops, best of 3: 13.9 µs per loop
In [7]: %timeit func2()
100000 loops, best of 3: 13.2 µs per loop
In [8]: %timeit func1()
100000 loops, best of 3: 13.9 µs per loop
In [9]: %timeit func2()
100000 loops, best of 3: 13.2 µs per loop
In [10]: %timeit func1()
100000 loops, best of 3: 13.8 µs per loop
In [11]: %timeit func2()
100000 loops, best of 3: 13.3 µs per loop
關於名單的理解,有沒有在速度上的差異,如果我改變它在的地方,而不是建立新的名單? – AlanH
我不確定,需要測試,但我想就地可能會比簡單地綁定到一個新名稱慢一點。 –
@AlanH我添加了時間比較,綁定到新名稱比位置更改要快一些。 –