una todos tamaño repetidos recorrer misma los llenar lista eliminar elementos elemento comparar agregar python list loops

python - todos - resultado extraño al eliminar un elemento de una lista



recorrer lista python (4)

Eliminar elementos de una lista es simple: comience al final de la lista:

li = range(1,15) print li,''/n'' for i in xrange(len(li)-1,-1,-1): if li[i] < 6: del li[i] print li

resultado

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14] [6, 7, 8, 9, 10, 11, 12, 13, 14]

Esta pregunta ya tiene una respuesta aquí:

Tengo este pedazo de código:

numbers = range(1, 50) for i in numbers: if i < 20: numbers.remove(i) print(numbers)

pero el resultado que obtengo es:

[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35 , 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49]

Por supuesto, estoy esperando que los números por debajo de 20 no aparezcan en los resultados, supongo que estoy haciendo algo mal con la eliminación.


Está modificando la lista mientras la itera. Eso significa que la primera vez a través del ciclo, i == 1 , entonces 1 se elimina de la lista. Luego, el ciclo for va al segundo elemento de la lista, que no es 2, sino 3. Entonces eso se elimina de la lista, y luego el bucle for pasa al tercer elemento de la lista, que ahora es 5. Y así sucesivamente. Tal vez es más fácil visualizarlo así, con un ^ apuntando al valor de i :

[1, 2, 3, 4, 5, 6...] ^

Ese es el estado de la lista inicialmente; luego se elimina 1 y el bucle pasa al segundo elemento de la lista:

[2, 3, 4, 5, 6...] ^ [2, 4, 5, 6...] ^

Y así.

No hay una buena manera de modificar la longitud de una lista mientras se itera sobre ella. Lo mejor que puedes hacer es algo como esto:

numbers = [n for n in numbers if n >= 20]

o esto, para la alteración in situ (la cosa en parens es una expresión del generador, que se convierte implícitamente en una tupla antes de la tarea de corte):

numbers[:] = (n for in in numbers if n >= 20)

Si desea realizar una operación en n antes de eliminarla, un truco que podría intentar es este:

for i, n in enumerate(numbers): if n < 20 : print "do something" numbers[i] = None numbers = [n for n in numbers if n is not None]


Me gusta mucho la respuesta @senderle provista. Lo único que quiero agregar (lo habría comentado, pero no puedo obtener el formato correcto del código) es que también puede salirse con la suya con el procesamiento lateral para su comprensión de la lista si declara sus funciones con anticipación de la siguiente manera:

def checkRemoval(item): # some processing here return passed_inspection # Should be True / False. newList = [item for item in oldList if checkRemoval(item)]


@senderle''s respuesta de @senderle''s es el camino a seguir!

Habiendo dicho eso para ilustrar aún un poco más su problema, si lo piensa, siempre querrá eliminar el índice 0 veinte veces:

[1,2,3,4,5............50] ^ [2,3,4,5............50] ^ [3,4,5............50] ^

Entonces podrías ir con algo como esto:

aList = range(50) i = 0 while i < 20: aList.pop(0) i += 1 print aList #[21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49]

Espero que ayude.

Los siguientes no son malas prácticas AFAIK.

EDITAR (Algunos más):

lis = range(50) lis = lis[20:]

Hará el trabajo también.

EDIT2 (estoy aburrido):

functional = filter(lambda x: x> 20, range(50))