problema Eliminando elementos de la lista en un bucle for (python)

Posible duplicado:
Eliminar elementos de una lista mientras se itera en Python

Hola, tengo un problema. Parece que no puedo eliminar los elementos mientras estoy iterando a través de una lista en Python. Esto es lo que tengo: un título debe eliminarse si un usuario ingresa n o N cuando se le pregunta qué eliminar en el ciclo for el problema es que cuando todo está listo, todos los elementos siguen allí y ninguno se ha eliminado …

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 

El siguiente código solucionará su problema. Tienes que iterar sobre una copia de la lista. No puedes eliminar elementos de la lista sobre la que estás iterando.

 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 

Su código en realidad tiene dos problemas principales.

La primera es que no está llamando al método upper , sino simplemente haciendo referencia a él. Debe llamarlo (a través de Question.upper() ) como w00t hace en su respuesta.

Poner algunas declaraciones de impresión de diagnóstico dentro de su bucle hubiera sido una buena manera de ver eso (especialmente imprimiendo str(Question.upper) ) (Tangente: Question es un mal nombre para una variable que contiene la respuesta a una pregunta que hizo el progtwig el usuario)

En segundo lugar, la eliminación de los elementos ya vistos de una lista sobre la que está iterando dará como resultado la omisión de valores. En realidad, no es necesario copiar la lista completa para lidiar con eso, simplemente iterar sobre ella a la inversa es suficiente para solucionar el problema.

Finalmente, un par de puntos cosméticos menores son que raw_input() acepta un argumento de solicitud, por lo que no necesita una statement de impresión separada y llamar a upper() en una cadena siempre devolverá una cadena:

 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 

Creo que el problema principal en su código fue el uso incorrecto de la función superior. Una vez que lo arregles, puedes eliminar los títulos de la lista a tu gusto. Puede utilizar el índice o el valor. Aquí está el código cortado que funcionó para mí

 #! / usr / bin / python

 cadena de importación

 titles_list = ["English", "Math", "Biology", "IT", "History"]
 para el título en títulos_list:
   answer = raw_input ("¿Desea conservar este título% s, escriba y o n \ n"% (título))
   Si string.upper (respuesta) == "N":
     # i = titles_list.index (title)
     # del titles_list [i]
     titles_list.remove (title)
     imprimir "ahora la lista es", lista_ títulos
 imprimir lista de títulos

Por favor vea las líneas comentadas usando el índice. Además, puede hacer que su código sea más conciso mediante la función raw_input (solicitud).

También debe pensar en el escenario en el que hay varias apariciones de los mismos títulos en su lista, en ese caso sugiero obtener todos los índices para el título hasta que la lista esté vacía y eliminar los títulos usando del (índice) como las soluciones. presentado anteriormente solo eliminará la primera aparición del título.

Sé que ya hay una respuesta, aquí hay otra forma de completar y demostrar la comprensión de la lista.

Este método toma una lista, pide conservar cada elemento y devuelve una nueva lista excluyendo las marcadas para su eliminación:

 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]