繁体   English   中英

为什么list.remove()在此for循环中不起作用?

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM