可能重复:
在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)
您的代码实际上有两个主要问题.
第一个是,你是不是调用的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)