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

unable to delete all element satisfying condition in a python list using 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,这使得被删除元素之后的元素未被选中。 那么如何检查所有元素呢?有没有更好的方法?

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

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].

此问题记录在 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)

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

 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 的非零元素的子列表。 将上面的内容放在一个函数中,然后 return 列表 t 。