在for循环中删除列表项的问题(python)

11 投票
4 回答
21325 浏览
提问于 2025-04-16 14:14

可能重复的问题:
在Python中遍历列表时删除项目

你好,我遇到了一个问题,我在用Python遍历列表的时候,似乎无法删除列表中的项目。
我想要实现的是:当用户在询问是否删除时输入n或N,就应该删除这个标题。但是问题是,当所有操作完成后,列表中的项目依然都在,根本没有被删除……

    titles_list = ["English", "Math", "History", "IT", "Biology", "Spanish"]

    for title in titles_list:
        print "Do you want to keep the title:", title , "\n or Delete it ? Input Y for keep, N for Delete "
        Question = raw_input()
        if str(Question.upper) == "N":
            titles_list.remove(title)

print titles_list

4 个回答

1

我觉得你代码中的主要问题是对upper函数的使用不正确。一旦你修正了这个问题,就可以随意从列表中删除标题。你可以使用索引或者直接用值来删除。下面是我用过的有效代码片段:

#!/usr/bin/python

import string

titles_list = ["English", "Math", "Biology", "IT", "History"]
for title in titles_list:
  answer = raw_input("Do you want to keep this title %s, type y or n\n" % (title))
  if string.upper(answer) == "N":
    # i = titles_list.index(title)
    # del titles_list[i]
    titles_list.remove(title)
    print "now list is" , titles_list
print titles_list

请查看使用索引的注释行。另外,你可以通过使用raw_input(prompt)这个功能,让你的代码更简洁。

你还需要考虑一个情况,就是列表中可能会有多个相同的标题。在这种情况下,我建议你获取所有该标题的索引,直到列表为空,然后使用del(index)来删除这些标题,因为之前提到的解决方案只会删除第一个出现的标题。

8

你的代码其实有两个主要问题。

第一个问题是,你并没有真正调用 `upper` 方法,而只是提到了它。你需要真正调用它(通过 `Question.upper()`),就像 w00t 在他的回答中做的那样。

在你的循环里加一些调试用的打印语句会是个好主意,这样你就能看到问题所在(特别是打印出 `str(Question.upper)`)。顺便说一下,`Question` 这个变量名不太好,因为它用来存储程序问用户的问题的答案。

第二个问题是,从你正在遍历的列表中删除已经看过的项目会导致跳过某些值。其实你不需要复制整个列表来解决这个问题——只需反向遍历列表就能解决。

最后,还有几个小的建议,`raw_input()` 可以接受一个提示参数,所以你不需要单独的打印语句。而且,对一个字符串调用 `upper()` 方法本身总是会返回一个字符串:

titles_list = ["English", "Math", "History", "IT", "Biology", "Spanish"]
prompt = ("Do you want to keep the title: {}\n"
          "or Delete it? Input Y for keep, N for Delete: ")

for title in reversed(titles_list):
    answer = raw_input(prompt.format(title))
    if answer.upper() == "N":
        titles_list.remove(title)

print titles_list
16

下面的代码可以解决你的问题。你需要在列表的一个副本上进行遍历。因为你不能在遍历的同时从列表中删除项目。

import copy

def main():
    titles_list = ["English", "Math", "History", "IT", "Biology", "Spanish"]
    titles_list_orig = copy.deepcopy(titles_list)

    for title in titles_list_orig:
        print "Do you want to keep the title:", title , "\n or Delete it? Input Y for keep, N for Delete "
        Question = raw_input()
        if str(Question.upper()) == "N":
            titles_list.remove(title)

    print titles_list

撰写回答