簡體   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