Eliminar elemento de la lista en Python mientras se itera sobre él

Estoy escribiendo un algoritmo round robin para una aplicación de torneo.

Cuando el número de jugadores es impar, agrego 'DELETE' a la lista de jugadores, pero luego, cuando quiero eliminar todos los elementos de la lista de horarios que contienen 'DELETE' , no puedo, siempre queda uno. Por favor, eche un vistazo al código: el problema es simple y supongo que se trata de listas; Simplemente no puedo verlo.

 """ Round-robin tournament: 1, 2, 3, 4, | 5, 6, 7, 8 => 1, 2, 3, 4 => rotate all but 1 => 1, 5, 2, 3 => repeat => 1, 6, 5, 2 ... 5, 6, 7, 8 6, 7, 8, 4 7, 8, 4, 3 in every round pick l1[0] and l2[0] as first couple, after that l1[1] and l2[1]... """ import math lst = [] schedule = [] delLater = False for i in range(3): #make list of numbers lst.append(i+1) if len(lst) % 2 != 0: #if num of items is odd, add 'DELETE' lst.append('DELETE') delLater = True while len(schedule) < math.factorial(len(lst))/(2*math.factorial(len(lst) - 2)): #!(n)/!(nk) mid = len(lst)/2 l1 = lst[:mid] l2 = lst[mid:] for i in range(len(l1)): schedule.append((l1[i], l2[i])) #add lst items in schedule l1.insert(1, l2[0]) #rotate lst l2.append(l1[-1]) lst = l1[:-1] + l2[1:] if delLater == True: #PROBLEM!!! One DELETE always left in list for x in schedule: if 'DELETE' in x: schedule.remove(x) i = 1 for x in schedule: print i, x i+=1 

Related of "Eliminar elemento de la lista en Python mientras se itera sobre él"

No deberías modificar la lista mientras estés iterando sobre ella:

 for x in schedule: if 'DELETE' in x: schedule.remove(x) 

En su lugar, intente:

 schedule[:] = [x in schedule where 'DELETE' not in x] 

Para obtener más información, consulte Eliminar elementos de una lista mientras se está iterando.

 schedule[:] = [x for x in schedule if 'DELETE' not in x] 

Vea las otras preguntas sobre la eliminación de una lista mientras se repite sobre ella .

Para eliminar elementos de una lista mientras se itera sobre ella, debe retroceder:

 if delLater == True: for x in schedule[-1::-1]): if 'DELETE' in x: schedule.remove(x) 

Una mejor opción es usar una lista-comprensión:

 schedule[:] = [item for item in schedule if item != 'DELETE'] 

Ahora, solo puede hacer la schedule = lugar de la schedule[:] = – ¿cuál es la diferencia? Un ejemplo es este:

 schedule = [some list stuff here] # first time creating modify_schedule(schedule, new_players='...') # does validation, etc. def modify_schedule(sched, new_players): # validate, validate, hallucinate, illustrate... sched = [changes here] 

En este punto, todos los cambios realizados por modify_schedule se han perdido. ¿Por qué? Porque en lugar de modificar el objeto de la lista en su lugar, redefinió el progtwig de nombres a una nueva lista, dejando la lista original aún vinculada al schedule nombres en la persona que llama.

Por lo tanto, si utiliza o no list_object[:] = depende de si desea que otros nombres vinculados a su lista vean los cambios.

No modifique una secuencia sobre la que se itera.

 schedule[:] = [x for x in schedule if 'DELETE' not in x]