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方法,效率更好。

  • 相关阅读:
    win32_弹弹球游戏
    蓝桥杯评测_前n项和
    算法_fibonacci_递归求值
    PTA 分类
    _tmain() 和 main()
    VS2010 C++ 插件 VissualAssistX 安装
    vs2010 > LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
    int、long、long long 的取值范围
    B树 B-树 B+树 B*树
    PTA 5-10 公路村村通 (30)
  • 原文地址:https://www.cnblogs.com/piperck/p/5661692.html
Copyright © 2011-2022 走看看