python 删除多行数组元素

笔者在项目过程中需要删除连续的多行数组,查了好多资料,发现python只能一行一行的删除,如果删除连续的多行的话,由于其中指针的变化,会出现后面数组的指标越界的现象,为此,将资料进行整合,以及给出自己的代码

首先先给出删除多个元素的时候会出现越界现象的原因,这一部分来自yongh701的http://blog.csdn.net/yongh701/article/details/47166951


如下的一段小程序,

[python]  view plain  copy
  1. #-*-coding:utf-8-*-  
  2. arr=[1,2,3];  
  3. for a in arr:  
  4.     if a<3:  
  5.         arr.remove(a);  
  6. print arr;  

我本来想用数组中自动封装好的remove()方法,删除数组arr中少于3的元素。

这个方法删除数组中单个元素是没有任何问题,但是如果想删除arr中,少于3的元素问题就来的。

arr中有三个元素,1,2,3,少于3的元素有2个,删除之后很显然只是剩下[3],我开始也是这样认为,但是运行结果却是[2,3],如下图所示:


原因是这样的:


remove()在删除数组单个元素的时候,删完元素很明显需要把指针位置向前移1位,这就发生如上图所示的指针偏移。

因此需要删除数组中多个元素的时候,绝对不能向上面那样写。

为此,可以用如下的方式结局,进行数组中多个元素删除的时候,先把这个数组复制一个,删的时候,遍历临时数组,删元数组的元素,删完再删除临时数组,这就不会发生因删除而导致的指针偏移了。具体代码如下:

[python]  view plain  copy
  1. #-*-coding:utf-8-*-  
  2. arr=[1,2,3];  
  3. arr_temp=arr[:]#直接创建一个新的数组arr_temp并将arr的元素倒进来,arr_temp=arr的话,arr_temp仅仅是一个指向arr数组的指针而已。  
  4. for a in arr_temp:  
  5.     if a<3:  
  6.         arr.remove(a);  
  7. del arr_temp;  
  8. print arr;  

运行结果自然也符合我们所想象的一样,最后在arr里面剩余3这个元素!

中间我又试了好多种方法,其中收获最大的是,我知道了python的深拷贝与浅拷贝,这个真的是太重要了,以后大家自己注意就好了,这块走的弯路就不记录了,给大家介绍一下python中的深拷贝和浅拷贝吧

引用是指保存的值为对象的地址。在 Python 语言中,一个变量保存的值除了基本类型保存的是值外,其它都是引用,因此对于它们的使用就需要小心一些。下面举个例子:

问题描述:已知一个列表,求生成一个新的列表,列表元素是原列表的复制

复制代码代码如下:

a=[1,2]
b=a

这种做法其实并未真正生成一个新的列表,b指向的仍然是a所指向的对象。这样,如果对a或b的元素进行修改,a,b的值同时发生变化。

解决的方法为:

复制代码代码如下:

a=[1,2]
b=a[:]

这样修改a对b没有影响。修改b对a没有影响。

但 这种方法只适用于简单列表,也就是列表中的元素都是基本类型,如果列表元素还存在列表的话,这种方法就不适用了。原因就是,象a[:]这种处理,只是将列 表元素的值生成一个新的列表,如果列表元素也是一个列表,如:a=[1,[2]],那么这种复制对于元素[2]的处理只是复制[2]的引用,而并未生成 [2]的一个新的列表复制。为了证明这一点,测试步骤如下:

复制代码代码如下:

>>> a=[1,[2]]
>>> b=a[:]
>>> b
[1, [2]]
>>> a[1].append(3)
>>> a
[1, [2, 3]]
>>> b
[1, [2, 3]]

可见,对a的修改影响到了b。如果解决这一问题,可以使用copy模块中的deepcopy函数。修改测试如下:
复制代码代码如下:

>>> import copy
>>> a=[1,[2]]
>>> b=copy.deepcopy(a)
>>> b
[1, [2]]
>>> a[1].append(3)
>>> a
[1, [2, 3]]
>>> b
[1, [2]]

有时候知道这一点是非常重要的,因为可能你的确需要一个新的列表,并且对这个新的列表进行操作,同时不想影响原来的列表。

这部分的内容可一自行百度去学习深拷贝、浅拷贝以及引用的一些概念。

下面说一个我的小技巧来删除二维数组,那就是倒序删除,因为这样就不会影响指针的指向了,程序如下:

removeylen=len(removey)
removey.sort()

for x in range(removeylen)[::-1]:
    for i in range(4*removey[x],4*removey[x]+4)[::-1]:
        box1=np.delete(box1,i,0)
 

倒序操作的前提是,你要确保里面的数字是由小到大排序的。



欢迎转载


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值