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