- python - 动态从数组中删除元素,并且减小数组的大小

在删除元素之后,需要一个解决方案来修复列表的大小。

不能创建新列表,因为那样问题会更大,而且每次都需要计算一个新列表,


list = [1,2,3,4,5,6,7,8,9,10]



for i in range (len(list)):


 if a[i] < 6:


 del a[i]



输出应该是原始列表,值为

 
[6,7,8,9,10]



 
时间:

如果要从列表(或列表开头的元素)中删除一个元素,可能去需要找到索引而不是查看所有的元素:


index = lst.index(6)


del lst[:index]



如果要删除多个项,可以创建索引列表以便删除,并且按相反顺序处理它们:


indexes = []


for i,a in enumerate(lst):


 if a > 2 and a < 5:


 indexes.append(i)


for index in reversed(indexes):


 del lst[index] 



或者,你可以按照相反的顺序处理列表,并在执行操作时删除该列表:


for i in range(len(lst)-1,-1,-1):


 if lst[i] > 2 and lst[i] < 5:


 del lst[i]



如果删除许多条目,这可能比第二个列表高得多,在最佳情况下,将有多个内存移动,因为删除了项目,最坏情况下,将在内部列出完整的列表副本。

另一种方法是手动移除删除后的后续项目,并截断最后的列表:


nextIndex = 0


for i,a in enumerate(lst):


 if a > 2 and a < 5:


 continue


 if nextIndex < i:


 lst[nextIndex] = a


 nextIndex += 1


del lst[nextIndex:] 



请注意,在我的性能测试中,对于大部分已删除的项目,这个手动移位方案的效率大约是前两种方法的2到3倍,但是,这取决于您在每次迭代时删除的项目的比例,

最后,可替代的方法可以为你要删除的项分配,并且跳过后续迭代中的无值:


for i,a in enumerate(lst):


 if a is None: continue


 if a > 2 and a < 5:


 lst[i] = None


 ...



只需覆盖当前的名单


lst = [1,2,3,4,5,6,7,8,9,10]



lst =[i for i in lst if i>=6]



# lst = [6,7,8,9,10]



首先,使用列表推导更容易:


lst = [1,2,3,4,5,6,7,8,9,10]


t = [x for x in lst if x >= 6]


print(t)



如果不允许创建新的list对象,则始终可以使用生成器表达式:


lst = [1,2,3,4,5,6,7,8,9,10]


g = (x for x in lst if x >= 6)



for val in g:


 print(val)



安全的(如果修改一个迭代的列表可以被称为"安全")解决方案是向后迭代:


n = len(list_)


for i in xrange(n):


 idx = n - i - 1


 if list_[idx] < 6:


 del list_[idx]



这样,至少不会更改列表中未更改部分的更改。

...