zoukankan      html  css  js  c++  java
  • 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方法,效率更好。

  • 相关阅读:
    有序表查找
    遍历二叉树
    二叉树
    [Oracle]使用InstantClient访问Oracle数据库
    [部署]CentOS yum源
    [部署]CentOS安装PHP环境
    [部署]CentOS安装MariaDB
    [部署]CentOS安装apache
    Metrics.NET源码阅读笔记
    [JavaScript]catch(ex)语句中的ex
  • 原文地址:https://www.cnblogs.com/piperck/p/5661692.html
Copyright © 2011-2022 走看看