[英]Why does list.remove() not work in this for-loop?
我有一个清单清单:
W = [[5.0, 0, 0, 0, 0], [5.0, 0, 0, 0], [0, 0, 0], [5.0, 0, 0, 0], [5.0, 0, 0, 0]]
我想从W
每个列表中删除零个条目。
我尝试了以下方法:
for idx in range(len(W)):
W[idx].remove(0)
print(W)
但它总是会回来
[[5.0, 0, 0, 0, 0], [5.0, 0, 0, 0], [0, 0, 0], [5.0, 0, 0, 0], [5.0, 0, 0, 0]]
这里什么都没有改变。 我知道以下事实:在迭代对象时无法更改对象,但是由于我不是在W
而是在len(W)
迭代,所以我不明白为什么我的代码无法正常工作。
我究竟做错了什么?
正如avloss所说,那个remove只删除第一次出现。 做一个列表理解。
for idx in range(len(W)):
W[idx] = [i for i in W[idx] if i != 0]
print(W)
并按照@meowgoesthedog的建议,您可以进行整体列表理解:
W = [lst[item for item in lst if item !=0] for lst in W]
如果要删除所有0
元素,则可以使用用户列表理解和过滤器:
W = [[5.0, 0, 0, 0, 0], [5.0, 0, 0, 0], [0, 0, 0], [5.0, 0, 0, 0], [5.0, 0, 0, 0]]
for idx in range(len(W)):
W[idx] = [i for i in W[idx] if i != 0]
print(W)
输出看起来像这样:
[[5.0], [5.0], [], [5.0], [5.0]]
您可以使用列表理解和过滤功能删除W
每个子列表中值为零的项目:
W = [[5.0, 0, 0, 0, 0], [5.0, 0, 0, 0], [0, 0, 0], [5.0, 0, 0, 0], [5.0, 0, 0, 0]]
nw = [list(filter(lambda a: a != 0, k)) for k in W]
输出 :
[[5.0], [5.0], [], [5.0], [5.0]]
我想说最好是将过滤器与lambda表达式一起使用,以过滤出零值。
for idx in range(len(W)):
W[idx]=list((filter(lambda a: a != 0, W[idx])))
print(W)
这将为您提供下一个输出:
[[5.0], [5.0, 0, 0, 0], [0, 0, 0], [5.0, 0, 0, 0], [5.0, 0, 0, 0]]
[[5.0], [5.0], [0, 0, 0], [5.0, 0, 0, 0], [5.0, 0, 0, 0]]
[[5.0], [5.0], [], [5.0, 0, 0, 0], [5.0, 0, 0, 0]]
[[5.0], [5.0], [], [5.0], [5.0, 0, 0, 0]]
[[5.0], [5.0], [], [5.0], [5.0]]
一个简单的列表理解就足够了。
W = [[5.0, 0, 0, 0, 0], [5.0, 0, 0, 0], [0, 0, 0], [5.0, 0, 0, 0], [5.0, 0, 0, 0]]
li = [ [j] for i in W for j in i if j!=0]
print(li)
#[[5.0], [5.0], [5.0], [5.0]]
由于每个子列表中的零个以上,因此如果您要坚持使用基于循环的解决方案,则必须使用两个for
循环。
In [75]: for lst in W:
...: num_zeros = lst.count(0)
...: for _ in range(num_zeros):
...: lst.remove(0)
In [76]: W
Out[76]: [[5.0], [5.0], [], [5.0], [5.0]]
现在,您的代码:
In [79]: for idx in range(len(W)):
...: W[idx].remove(0)
...: print(W)
产生解决方案:
[[5.0, 0, 0, 0], [5.0, 0, 0], [0, 0], [5.0, 0, 0], [5.0, 0, 0]]
我们可以看到输入列表中的零计数中缺少1个零。 这是因为remove(obj)
将仅删除该对象的第一次出现。
这是因为l.remove(0)
表示删除该元素的第一次出现 。 通过索引删除元素,您可以使用del
W = [[5.0, 0, 0, 0, 0], [5.0, 0, 0, 0], [0, 0, 0], [5.0, 0, 0, 0], [5.0, 0, 0, 0]]
for idx in range(len(W)):
del W[idx][0]
print(W)
这产生
[[0, 0, 0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0, 0]]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.