请帮助我在Python 3代码挑战的代码中找到错误



在Udemy上有一个挑战,您必须从列表中删除特定的字符串。在这次挑战中;垃圾邮件";。下面是给定的列表:

[
["egg", "bacon"],
["egg", "sausage", "bacon"],
["egg", "spam"],
["egg", "bacon", "spam"],
["egg", "bacon", "sausage", "spam"],
["spam", "bacon", "sausage", "spam"],
["spam", "sausage", "spam", "bacon", "spam", "tomato", "spam"],
["spam", "egg", "spam", "spam", "bacon", "spam"],
]

以下是我提出的解决方案:

menu = [
["egg", "bacon"],
["egg", "sausage", "bacon"],
["egg", "spam"],
["egg", "bacon", "spam"],
["egg", "bacon", "sausage", "spam"],
["spam", "bacon", "sausage", "spam"],
["spam", "sausage", "spam", "bacon", "spam", "tomato", "spam"],
["spam", "egg", "spam", "spam", "bacon", "spam"],
]
for meal in menu:
for item in meal:
if "spam" in item:
meal.remove("spam")
print(meal)

在代码被执行之后;垃圾邮件";除最后一个外已删除。我尝试了调试,最后一个垃圾邮件的删除确实执行了,但不确定为什么它仍然显示在输出中。以下是输出:

['egg', 'bacon']
['egg', 'sausage', 'bacon']
['egg']
['egg', 'bacon']
['egg', 'bacon', 'sausage']
['bacon', 'sausage']
['sausage', 'bacon', 'tomato']
['egg', 'bacon', '**spam**']

有人能帮我找出错误吗?或者这是一个bug?

使用列表理解可以避免从正在迭代的列表中删除项目的问题,也可以获得更干净的代码。

spam_free = [[item for item in meal if item != "spam"] for meal in menu]

如果你想像你的例子中那样使用老式的wy,只需确保创建新的列表:

spam_free = []
for meal in menu:
new_meal = []
spam_free.append(new_meal)
for item in meal:
if item != "spam":
new_meal.append(item)

最新更新