复现的情况大概可以写成这样
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方法,效率更好。