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

时间:2011-03-23 06:29:34

标签: python list loops

  

可能重复:
  Remove items from a list while iterating in Python

嗨我有一个问题我似乎无法删除项目,同时迭代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

4 个答案:

答案 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]