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



我正在尝试使用以下代码从列表中删除零值

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递增的ID在未选中的元件后留下元素。那么如何检查所有元素?有更好的方法吗?

我对您的代码进行了一些更改:

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不认识到元素已从列表中删除。<<<<<<<<<<<<<<<<br>如果您的数组内部有10个元素,并且删除了第一个(IDX 0),则在下一个迭代中,您将在索引1处进行修改,但该数组已修改,因此您的IDX 1是您的数组的IDX 2删除,真正的IDX 1将被跳过。

因此,您只需要以反向模式循环阵列,并且不会错过索引。

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

在8.3下的Python页面上记录了此问题:

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)

枚举返回一个称为枚举对象的对象,它实际上不是列表。第二件事行不是列表,它不可订阅。

 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。

最新更新