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

RY4*_*Y4N 7 python loops list

可能重复:
在Python中迭代时从列表中删除项目

嗨我有一个问题,我似乎无法删除项目,同时迭代python中的列表,这是我得到的:如果用户输入n或N时,如果要求在for循环中删除问题,则应删除标题,问题是,当它完成所有项目时,所有项目仍然存在且没有被删除...

    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
Run Code Online (Sandbox Code Playgroud)

w00*_*00t 10

以下代码将解决您的问题.您必须迭代列表的副本.您无法从正在迭代的列表中删除项目.

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
Run Code Online (Sandbox Code Playgroud)


nco*_*lan 8

您的代码实际上有两个主要问题.

第一个是,你是不是调用upper方法,而只是引用它.您需要实际调用它(via Question.upper()),就像他的答案中所做的那样.

将一些诊断打印语句放在循环中是一种很好的方式来查看(特别是打印出来str(Question.upper))(Tangent:Question对于一个变量的错误名称,该变量可以解答程序对用户提出的问题的答案)

其次,从正在迭代的列表中删除已经看到的项将导致跳过值.你实际上并不需要复制整个列表来处理它 - 只需反复迭代它就足以解决问题.

最后,一些小的装饰点raw_input()接受一个提示参数,所以你不需要一个单独的print语句,并且调用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
Run Code Online (Sandbox Code Playgroud)