无法使用枚举删除python列表中的所有元素满足条件

时间:2017-12-20 08:37:23

标签: python-3.x list enumerate

我正尝试使用以下代码

从列表中删除零值
for id,row in enumerate(list):
    if row[0]=="0":
       del list(id)

这对输入很好 [0,1,3,0,9,10,0,3,0,6]

但是对于像这样的输入没有预期的效果 [ 0,0 下,1,3,4,0,0,4,5,6,的 0,0 ]。

输出:[0,1,3,4,0,4,5,6,0]

我猜它是因为删除后的元素正好被删除元素的id,并且枚举增加了在未删除删除元素之后离开元素的id。 那么可以做些什么来检查所有元素?有更好的方法吗?

3 个答案:

答案 0 :(得分:0)

我对你的代码做了一些改动:

mylist = [0,0,1,3,4,0,0,4,5,6,0,0]
for id,row in reversed(list(enumerate(mylist))):
    if(row==0):
        del mylist[id]

如果以你的方式循环列表(从开始到结束)并在执行时删除元素,你最终会跳转索引,因为python无法识别元素是否已从列表中删除。登记/> 如果你有一个包含10个元素的数组,你删除第一个(idx 0),在下一次迭代中你将在索引1,但是数组已被修改,所以你的idx 1是你之前的数组的idx 2删除,将跳过真正的idx 1。

所以你只需要以反向模式循环你的阵列,你就不会错过索引。

如果您打印mylist的值,则会获得[1, 3, 4, 4, 5, 6]

答案 1 :(得分:0)

这个问题记录在这个python页面下的8.3:

https://docs.python.org/3/reference/compound_stmts.html

他们建议使用切片这样做。它对我有用:

a = [-2,-4,3,4]
for x in a[:]:
    if x < 0: a.remove(x)
print ('contents of a now: ')
print(*a)

答案 2 :(得分:0)

enumerate返回一个名为enumerate对象的对象,它是可迭代的,实际上不是列表。第二件事行不是一个不可订阅的列表。

 for i,row in enumerate(l):
     if row==0:
        del(l[i])

你不会得到你想要的结果。

试试这个:

t=[] #a temporary list
for i in l:
    if i!=0:
        t.append(i)

t将包含具有非零元素的l子列表。 将上面的内容放在一个函数中并返回列表t。