python删除数组元素导致跳过元素

复现的情况大概可以写成这样

abc = [1, 2, 2, 3, 4]
print abc

for index, i in enumerate(abc):
    if i == 2:
        del abc[index]

print abc

可以发现一个问题,按照我的想法这个例子将会把两个2都删除了之后得到一个只有元素[1, 3, 4]的abc。

但是实际操作之后发现,其将返回一个[1, 2, 3, 4]的数组

这究竟是怎么导致的????

 

问题就在于我直接在原始数组里面del掉了某个符合条件的元素,比如我在index==1的时候删掉了第一个2 这个时候再进行下次循环的时候index==2但是原来的数组abc编程了[1, 2, 3, 4],而index==2是3,跳过了2导致了结果与我们的预期完全不一样了。

 

我用了一个站位的方式来占着需要删除的家伙,然后让index依然可以正常寻址,但死这个方法。并不是最好的,因为数组的insert方法在非常大的情况下面效率非常低。

abc = [1, 2, 2, 3, 4]
print abc

for index, i in enumerate(abc):
    if i == 2:
        del abc[index]
        abc.insert(index, None)

print filter(None, abc)

 

应该有更好的办法?

由于判断条件的关系。。我直接用了一个更取巧的办法

abc = [1, 2, 2, 3, 4]
print abc

for index, i in enumerate(abc):
    if i == 2:
       abc[index] = None
       
print filter(None, abc)

直接给符合条件的元素赋值成不可能的值,最后再来过滤,这样也不用使用O(n)的insert方法,效率更好。

posted @ 2016-07-11 21:30  piperck  阅读(7081)  评论(0编辑  收藏  举报