要遍历列表时,回答的第一个问题,其原因,内部的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我添加了时间比较,绑定到新名称比位置更改要快一些。 –