我正尝试使用以下代码
从列表中删除零值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。 那么可以做些什么来检查所有元素?有更好的方法吗?
答案 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。