運行此 python 代碼時:
shapes = [{"label": "bad_stuff"}, {"label": "cat"}, {"label": "cat"},{"label": "cat"}, {"label": "bad_stuff"}, {"label": "bad_stuff"}]
for elem in shapes:
if elem['label'] == "bad_stuff":
shapes.remove(elem)
...我得到這個結果:
[{'label': 'cat'}, {'label': 'cat'}, {'label': 'cat'}, {'label': 'bad_stuff'}]
為什么代碼不洗掉串列中的最后一個元素,我該如何解決?
uj5u.com熱心網友回復:
因為您在 for 回圈期間正在修改串列。讓我們看看您的代碼中發生了什么:
在第一次互動時,它會洗掉形狀 [0] 項。2、3、4次迭代不滿足條件,因此通過。在第 5 次迭代中,elem 為{"label": "bad_stuff"},您的形狀如下所示:
[{"label": "cat"}, {"label": "cat"},{"label": "cat"}, **{"label": "bad_stuff"}**, {"label": "bad_stuff"}]
因此,當您remove(elem)執行此步驟時,它會洗掉串列中的最后一項。并且由于您洗掉了最后一項 - 迭代停止。
您的問題有解決方案:
shapes = [{"label": "bad_stuff"}, {"label": "cat"}, {"label": "cat"},{"label": "cat"}, {"label": "bad_stuff"}, {"label": "bad_stuff"}]
cat_shapes = []
for elem in shapes:
if elem['label'] != "bad_stuff":
cat_shapes.append(elem)
DanielB在評論中提到的另一個解決方案 :
cat_shapes = [elem for elem in shapes if elem['label'] != "bad_stuff"]
uj5u.com熱心網友回復:
你可以用filter,
list(filter(lambda x:x['label'] != 'bad_stuff', shapes))
# [{'label': 'cat'}, {'label': 'cat'}, {'label': 'cat'}]
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/518391.html
標籤:Python列表
上一篇:查找字串中的所有串列元素
