【问题标题】:Python: Printing out list without certain itemPython:打印出没有特定项目的列表
【发布时间】:2023-01-22 22:17:50
【问题描述】:

我正在尝试遍历列表并希望打印出除垃圾邮件之外的所有项目。 但是,我不断收到以下错误消息:预期类型“list[str]”(匹配的泛型类型“_T”)改为“str”。

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"],
]
item = "-"
while item in menu != "spam":
    continue
if "spam" in menu:
    menu.remove("spam")
    print(menu)`

我还尝试了以下内容:

if item in menu == "spam"
    menu.remove("spam")

这导致了同样的问题。任何人都可以帮我解决这个问题吗?这让我发疯。

【问题讨论】:

  • 你的代码表现得好像 menu 是一个字符串列表,但 menu 是一个列表列表,这就是问题所在

标签: python list loops if-statement while-loop


【解决方案1】:

看起来问题出在 while 循环和 if 语句上。 这是您的代码的更正版本:

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 sub_list in menu:
    if "spam" in sub_list:
        sub_list.remove("spam")
    print(sub_list)

由于菜单是列表的列表,因此您需要遍历每个子列表并检查其中是否包含“垃圾邮件”。然后您可以使用 remove 方法从该子列表中删除“垃圾邮件”。 此外,在 python 中,while 循环将运行直到满足某个条件,而 while 循环中的条件是 item in menu != "spam" 这始终为 True,这就是它不起作用的原因

编辑:问题是 remove 方法只从列表中删除第一次出现的项目。在最后三个列表中,“垃圾邮件”出现了多次,因此您需要使用 while 循环从每个子列表中删除所有出现的“垃圾邮件”。这是您如何做到这一点的示例:

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 sub_list in menu:
    while "spam" in sub_list:
        sub_list.remove("spam")
    print(sub_list)

这将遍历每个子列表,当“垃圾邮件”仍在子列表中时,它将删除它。这样,它将从子列表中删除所有出现的“垃圾邮件”。

【讨论】:

  • 谢谢,这解释了 allot。我运行了你的代码,似乎“垃圾邮件”仍然从最后三个列表中打印出来。这个怎么可能?
  • 我已经编辑了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-03
  • 1970-01-01
  • 1970-01-01
  • 2013-08-06
  • 1970-01-01
  • 1970-01-01
  • 2014-07-09
相关资源
最近更新 更多