我正在尝试使用以下代码从列表中删除零值
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。