python pyhton列表-删除字典与某些关键字

qlvxas9a  于 2023-01-12  发布在  Python
关注(0)|答案(3)|浏览(160)

运行以下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'}]

为什么代码不删除列表中的最后一个元素?我该如何解决这个问题?

v2g6jxz6

v2g6jxz61#

因为你在for循环中修改了list,让我们看看你的代码中发生了什么:
在第一次迭代时,它删除shape [0] item。第2、3、4次迭代不满足条件,因此通过。在第五次迭代时,元素为{"label": "bad_stuff"},您的shape如下所示:

[{"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"]
z4iuyo4d

z4iuyo4d2#

你可以用filter来实现

list(filter(lambda x:x['label'] != 'bad_stuff', shapes))
# [{'label': 'cat'}, {'label': 'cat'}, {'label': 'cat'}]
yqlxgs2m

yqlxgs2m3#

如果你想从列表中删除匹配的元素,请检查下面的代码

def remove_bad_stuff(shapes, remove_value):
    for elem in shapes:
        if elem['label'] == remove_value:
            shapes.remove(elem)
            remove_bad_stuff(shapes, remove_value)

shapes = [{"label": "bad_stuff"}, {"label": "cat"}, {"label": "cat"},{"label": "cat"}, {"label": "bad_stuff"}, {"label": "bad_stuff"}]
remove_bad_stuff(shapes,"bad_stuff")
print(shapes)

相关问题