嗨我有一个问题我似乎无法删除项目,同时迭代python中的列表, 这就是我所拥有的:如果用户在for循环中询问要删除的问题时输入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
答案 0 :(得分: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
答案 1 :(得分:8)
您的代码实际上有两个主要问题。
首先,您不是调用 upper
方法,而只是引用它。您需要实际调用它(通过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
答案 2 :(得分:1)
我认为代码中的主要问题是上层函数的错误使用。修复后,您可以根据需要从列表中删除标题。您可以使用索引或值。这是为我工作的代码剪切
#!/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(提示)功能使代码更简洁。
您还需要考虑列表中多次出现相同标题的情况,在这种情况下,我建议获取标题的所有索引,直到列表为空并使用del(索引)删除标题因为上面提到的解决方案只会删除第一次出现的标题。
答案 3 :(得分:1)
我知道已有答案,这是完整性的另一种方式,并展示列表理解。
此方法采用一个列表,要求保留每个项目,并返回一个新的列表,不包括标记为删除的列表:
def delete_items(titles):
deleted_items = []
for title in titles:
print('keep %s?' % title)
if str(raw_input().upper()) == 'N':
deleted_items.append(title)
return [e for e in titles if e not in deleted_items]