Las listas son una estructura de datos muy flexible. Python permite manipular listas de muchas maneras. En esta lección aprenderás algunas de ellas:
Las listas son conjuntos ordenados de elementos (números, cadenas, listas, etc). Las listas se delimitan por corchetes ([ ]) y los elementos se separan por comas.
Las listas pueden contener elementos del mismo tipo:
>>> primos = [2, 3, 5, 7, 11, 13] >>> diasLaborables = ["Lunes", "Martes", "Miércoles", "Jueves", "Viernes"]
O pueden contener elementos de tipos distintos:
>>> fecha = ["Lunes", 27, "Octubre", 1997]
O pueden contener listas:
>>> peliculas = [ ["Senderos de Gloria", 1957], ["Hannah y sus hermanas", 1986]]
Las listas pueden tener muchos niveles de anidamiento:
>>> directores = [ ["Stanley Kubrick", ["Senderos de Gloria", 1957]], ["Woody Allen", ["Hannah y sus hermanas", 1986]] ]
Las variables de tipo lista hacen referencia a la lista completa.
>>> lista = [1, "a", 45] >>> lista [1, 'a', 45]
Una lista que no contiene ningún elemento se denomina lista vacía:
>>> lista = [ ] >>> lista [ ]
Al definir una lista se puede hacer referencia a otras variables.
>>> nombre = "Pepe" >>> edad = 25 >>> lista = [nombre, edad] >>> lista ['Pepe', 25]
Como siempre, hay que tener cuidado al modificar una variable que se ha utilizado para definir otras variables, porque esto puede afectar al resto de variables:
Nota: Este punto se trata en la lección Variables 2.
>>> nombre = "Pepe" >>> edad = 25 >>> lista = [nombre, edad] >>> lista ['Pepe', 25] >>> nombre = "Juan" >>> lista ['Pepe', 25]
>>> nombres = ["Ana", "Bernardo"] >>> edades = [22, 21] >>> lista = [nombres, edades] >>> lista [['Ana', 'Bernardo'], [22, 21]] >>> nombres += ["Cristina"] >>> lista [['Ana', 'Bernardo', 'Cristina'], [22, 21]]
Una lista puede contener listas (que a su vez pueden contener listas, que a su vez etc.):
>>> persona1 = ["Ana", 25] >>> persona2 = ["Benito", 23] >>> lista = [persona1, persona2] >>> lista [['Ana', 25], ['Benito', 23]]
Se puede acceder a cualquier elemento de una lista escribiendo el nombre de la lista y entre corchetes el número de orden en la lista. El primer elemento de la lista es el número 0.
>>> lista = [10, 20, 30, 40] >>> lista[2] 30 >>> lista[0] 10
Se pueden concatenar dos listas utilizando la operación suma.
>>> lista1 = [10, 20, 30, 40] >>> lista2 = [30, 20] >>> lista = lista1 + lista2 + lista1 >>> lista [10, 20, 30, 40, 30, 20, 10, 20, 30, 40]
Las listas se pueden concatenar con el símbolo de la suma (+):
>>> vocales = ["E", "I", "O"] >>> vocales ['E', 'I', 'O'] >>> vocales = vocales + ["U"] >>> vocales ['E', 'I', 'O', 'U'] >>> vocales = ["A"] + vocales >>> vocales ['A', 'E', 'I', 'O', 'U']
El operador suma (+) necesita que los dos operandos sean listas:
>>> vocales = ["E", "I", "O"] >>> vocales = vocales + "Y" Traceback (most recent call last): File "<pyshell#2>", line 1, in <module> vocales = vocales + "Y" TypeError: can only concatenate list (not "str") to list
También se puede utilizar el operador += para añadir elementos a una lista:
>>> vocales = ["A"] >>> vocales += ["E"] >>> vocales ['A', 'E']
Aunque en estos ejemplos, los operadores + y += den el mismo resultado, no son equivalentes, como se explica en la lección de Variables 2.
Cada elemento se identifica por su posición en la lista, teniendo en cuenta que se empieza a contar por 0.
>>> fecha = [27, "Octubre", 1997] >>> fecha[0] 27 >>> fecha[1] Octubre >>> fecha[2] 1997
No se puede hacer referencia a elementos fuera de la lista:
>>> fecha = [27, "Octubre", 1997] >>> fecha[3] Traceback (most recent call last): File "<pyshell#3>", line 1, in <module> fecha[3] Index error: list index out of range
Se pueden utilizar números negativos (el último elemento tiene el índice -1 y los elementos anteriores tienen valores descendentes):
>>> fecha = [27, "Octubre", 1997] >>> fecha[-1] 1997 >>> fecha[-2] Octubre >>> fecha[-3] 27
Se puede modificar cualquier elemento de una lista haciendo referencia a su posición:
>>> fecha = [27, "Octubre", 1997] >>> fecha[2] = 1998 >>> fecha[0] 27 >>> fecha[1] Octubre >>> fecha[2] 1998
De una lista se pueden extraer sublistas, utilizando la notación nombreDeLista[inicio:límite], donde inicio y límite hacen el mismo papel que en el tipo range(inicio, límite).
>>> dias = ["Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"] >>> dias[1:4] # Se extrae una lista con los valores 1, 2 y 3 ['Martes', 'Miércoles', 'Jueves'] >>> dias[4:5] # Se extrae una lista con el valor 4 ['Viernes'] >>> dias[4:4] # Se extrae una lista vacía [] >>> dias[:4] # Se extrae una lista hasta el valor 4 (no incluido) ['Lunes', 'Martes', 'Miércoles', 'Jueves'] >>> dias[4:] # Se extrae una lista desde el valor 4 (incluido) ['Viernes', 'Sábado', 'Domingo'] >>> dias[:] # Se extrae una lista con todos los valores ['Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado', 'Domingo']
Se puede modificar una lista modificando sublistas. De esta manera se puede modificar un elemento o varios a la vez e insertar o eliminar elementos.
>>> letras = ["A", "B", "C", "D", "E", "F", "G", "H"] >>> letras[1:4] = ["X"] # Se sustituye la sublista ['B','C','D'] por ['X'] >>> letras ['A', 'X', 'E', 'F', 'G', 'H'] >>> letras[1:4] = ["Y", "Z"] # Se sustituye la sublista ['X','E','F'] por ['Y','Z'] ['A','Y', 'Z', 'G', 'H'] >>> letras[0:1] = ["Q"] # Se sustituye la sublista ['A'] por ['Q'] >>> letras ['Q', 'Y', 'Z', 'G', 'H'] >>> letras[3:3] = ["U", "V"] # Inserta la lista ['U','V'] en la posición 3 >>> letras ['Q', 'Y', 'Z', 'U', 'V', 'G', 'H'] >>> letras[0:3] = [] # Elimina la sublista ['Q','Y', 'Z'] >>> letras ['U', 'V', 'G', 'H']
Al definir sublistas, Python acepta valores fuera del rango, que se interpretan como extremos (al final o al principio de la lista).
>>> letras = ["D", "E", "F"] >>> letras[3:3] = ["G", "H"] # Añade ["G", "H"] al final de la lista >>> letras ['D', 'E', 'F', 'G', 'H'] >>> letras[100:100] = ["I", "J"] # Añade ["I", "J"] al final de la lista >>> letras ['D', 'E', 'F', 'G', 'H', 'I', 'J'] >>> letras[-100:-50] = ["A", "B", "C"] # Añade ["A", "B", "C"] al principio de la lista >>> letras ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']
La palabra reservada del permite eliminar un elemento o varios elementos a la vez de una lista, e incluso la misma lista.
>>> letras = ["A", "B", "C", "D", "E", "F", "G", "H"] >>> del letras[4] # Elimina la sublista ['E'] >>> letras ['A', 'B', 'C', 'D', 'F', 'G', 'H'] >>> del letras[1:4] # Elimina la sublista ['B', 'C', 'D'] >>> letras ['A', 'F', 'G', 'H'] >>> del letras # Elimina completamente la lista >>> letras Traceback (most recent call last): File "<pyshell#1>", line 1, in ? letras NameError: name 'letras' is not defined
Si se intenta borrar un elemento que no existe, se produce un error:
>>> letras = ["A", "B", "C", "D", "E", "F", "G", "H"] >>> del letras[10] Traceback (most recent call last): File "<pyshell#1>", line 1, in <module> del letras[10] IndexError: list assignment index out of range
Aunque si se hace referencia a sublistas, Python sí que acepta valores fuera de rango, pero lógicamente no se modifican las listas.
>>> letras = ["A", "B", "C", "D", "E", "F", "G", "H"] >>> del letras[100:200] # No elimina nada >>> letras ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']
Con variables de tipo entero, decimal o de cadena, es fácil tener una copia de una variable para conservar un valor que en la variable original se ha perdido:
>>> a = 5 >>> b = a # Hacemos una copia del valor de a >>> a, b (5, 5) >>> a = 4 # de manera que aunque cambiemos el valor de a ... >>> a, b # ... b conserva el valor anterior de a en caso de necesitarlo (4, 5)
Pero si hacemos esto mismo con listas, nos podemos llevar un sorpresa:
>>> lista1 = ["A", "B", "C"] >>> lista2 = lista1 # Intentamos hacer una copia de la lista lista1 >>> lista1, lista2 (['A', 'B', ,'C'] ['A', 'B', ,'C']) >>> del lista1[1] # Eliminamos el elemento ['B'] de la lista lista1 ... >>> lista1, lista2 # ... pero descubrimos que también ha desaparecido de la lista lista2 (['A', 'C'] ['A', 'C'])
El motivo de este comportamiento (que se explica con más detalle en la lección Variables 2), es que los enteros, decimales y cadenas son objetos inmutables y las listas son objetos mutables.
Si queremos copiar una lista, de manera que conservemos su valor aunque modifiquemos la lista original debemos utilizar la notación de sublistas.
>>> lista1 = ["A", "B", "C"] >>> lista2 = lista1[:] # Hacemos una copia de la lista lista1 >>> lista1, lista2 (['A', 'B', 'C'] ['A', 'B', 'C']) >>> del lista1[1] # Eliminamos el elemento ['B'] de la lista lista1 ... >>> lista1, lista2 # ... y en este caso lista2 sigue conservando el valor original de lista1 (['A', 'C'] ['A', 'B', 'C'])
En el primer caso las variables lista1 y lista2 hacen referencia a la misma lista almacenada en la memoria del ordenador. Por eso al eliminar un elemento de lista1, también desaparece de lista2.
Sin embargo en el segundo caso lista1 y lista2 hacen referencia a listas distintas (aunque tengan los mismos valores, están almacenadas en lugares distintos de la memoria del ordenador). Por eso, al eliminar un elemento de lista1, no se elimina en lista2.
Se puede recorrer una lista de principio a fin de dos formas distintas:
Recorrer una lista directamente
letras = ["A", "B", "C"]
for i in letras:
print(i, end=" ")
A B C
Puede ver la ejecución paso a paso de este programa utilizando los iconos de avance y retroceso situados abajo a la derecha.
Recorrer una lista directamente - Paso 1
letras = ["A", "B", "C"]
for i in letras:
print(i, end=" ")
Se ejecuta la primera instrucción del programa.
En este caso, define la lista letras.
Recorrer una lista directamente - Paso 2
letras = ["A", "B", "C"]
for i in letras:
print(i, end=" ")
A continuación se ejecuta el bucle. La variable de control toma el primer valor de la lista letras.
En este caso, la variable de control es i y toma el valor "A".
Recorrer una lista directamente - Paso 3
letras = ["A", "B", "C"]
for i in letras:
print(i, end="")
A
A continuación se ejecutan las instrucciones del bloque.
En este caso el bloque consta de una sola instrucción que imprime el valor de i, es decir, "A".
Recorrer una lista directamente - Paso 4
letras = ["A", "B", "C"]
for i in letras:
print(i, end=" ")
A
A continuación la variable de control toma el segundo valor de la lista letras.
En este caso, la variable de control es i y toma el valor "B".
Recorrer una lista directamente - Paso 5
letras = ["A", "B", "C"]
for i in letras:
print(i, end="")
A B
A continuación se ejecutan por segunda vez las instrucciones del bloque.
En este caso el bloque consta de una sola instrucción que imprime el valor de i, es decir, "B".
Recorrer una lista directamente - Paso 6
letras = ["A", "B", "C"]
for i in letras:
print(i, end=" ")
A B
A continuación la variable de control toma el tercer y último valor de la lista letras.
En este caso, la variable de control es i y toma el valor "C".
Recorrer una lista directamente - Paso 7
letras = ["A", "B", "C"]
for i in letras:
print(i, end="")
A B C
A continuación se ejecutan por tercera y última vez las instrucciones del bloque.
En este caso el bloque consta de una sola instrucción que imprime el valor de i, es decir, "C".
Recorrer una lista indirectamente
letras = ["A", "B", "C"]
for i in range(len(letras)):
print(letras[i], end=" ")
A B C
Puede ver la ejecución paso a paso de este programa utilizando los iconos de avance y retroceso situados abajo a la derecha.
Recorrer una lista indirectamente - Paso 1
letras = ["A", "B", "C"]
for i in range(len(letras)):
print(letras[i], end=" ")
Se ejecuta la primera instrucción del programa.
En este caso, define la lista letras.
Recorrer una lista indirectamente - Paso 2
letras = ["A", "B", "C"]
for i in range(len(letras)):
print(letras[i], end=" ")
A continuación se ejecuta el bucle. La variable de control toma el primer valor de range(len(letras)). Como la lista letras tiene 3 elementos, len(letras) devuelve el valor 3 y range(len(letras)) devuelve range(3), es decir [0, 1, 2]. Es decir, que la variable de control va a tomar valores de [0, 1, 2]
En este caso, la variable de control es i y toma el valor 0.
Recorrer una lista indirectamente - Paso 3
letras = ["A", "B", "C"]
for i in range(len(letras)):
print(letras[i], end="")
A
A continuación se ejecutan las instrucciones del bloque.
En este caso el bloque consta de una sola instrucción que imprime el valor de letras[ i], es decir, letras[0], es decir, "A".
Recorrer una lista indirectamente - Paso 4
letras = ["A", "B", "C"]
for i in range(len(letras)):
print(letras[i], end=" ")
A
A continuación la variable de control toma el segundo valor de range(len(letras)), es decir, de [0, 1, 2].
En este caso, la variable de control es i y toma el valor 1.
Recorrer una lista indirectamente - Paso 5
letras = ["A", "B", "C"]
for i in range(len(letras)):
print(letras[i], end="")
A B
A continuación se ejecutan por segunda vez las instrucciones del bloque.
En este caso el bloque consta de una sola instrucción que imprime el valor de letras[ i], es decir, letras[1], es decir, "B".
Recorrer una lista indirectamente - Paso 6
letras = ["A", "B", "C"]
for i in range(len(letras)):
print(letras[i], end=" ")
A B
A continuación la variable de control toma el tercer y último valor de range(len(letras)), es decir, de [0, 1, 2].
En este caso, la variable de control es i y toma el valor 2.
Recorrer una lista indirectamente - Paso 7
letras = ["A", "B", "C"]
for i in range(len(letras)):
print(letras[i], end="")
A B C
A continuación se ejecutan por tercera y última vez las instrucciones del bloque.
En este caso el bloque consta de una sola instrucción que imprime el valor de letras[ i], es decir, letras[2], es decir, "C".
La primera forma es más sencilla, pero sólo permite recorrer la lista de principio a fin y utilizar los valores de la lista.
La segunda forma es más complicada, pero permite más flexibilidad, como muestran los siguientes ejemplos:
Recorrer una lista al revés
letras = ["A", "B", "C"]
for i in range(len(letras)-1, -1, -1):
print(letras[i], end=" ")
C B A
Puede ver la ejecución paso a paso de este programa utilizando los iconos de avance y retroceso situados abajo a la derecha.
Recorrer una lista al revés - Paso 1
letras = ["A", "B", "C"]
for i in range(len(letras)-1, -1, -1):
print(letras[i], end=" ")
Se ejecuta la primera instrucción del programa.
En este caso, define la lista letras.
Recorrer una lista al revés - Paso 2
letras = ["A", "B", "C"]
for i in range(len(letras)-1, -1, -1):
print(letras[i], end=" ")
A continuación se ejecuta el bucle. La variable de control toma el primer valor de range(len(letras)-1, -1, -1). Como la lista letras tiene 3 elementos, len(letras)-1 devuelve el valor 2 y range(len(letras)-1, -1, -1) devuelve range(2, -1, -1), es decir [2, 1, 0]. Es decir, que la variable de control va a tomar valores de [2, 1, 0]
En este caso, la variable de control es i y toma el valor 2.
Recorrer una lista al revés - Paso 3
letras = ["A", "B", "C"]
for i in range(len(letras)-1, -1, -1):
print(letras[i], end="")
C
A continuación se ejecutan las instrucciones del bloque.
En este caso el bloque consta de una sola instrucción que imprime el valor de letras[ i], es decir, letras[2], es decir, "C".
Recorrer una lista al revés - Paso 4
letras = ["A", "B", "C"]
for i in range(len(letras)-1, -1, -1):
print(letras[i], end=" ")
C
A continuación la variable de control toma el segundo valor de range(len(letras)-1, -1, -1), es decir, de [2, 1, 0].
En este caso, la variable de control es i y toma el valor 1.
Recorrer una lista al revés - Paso 5
letras = ["A", "B", "C"]
for i in range(len(letras)-1, -1, -1):
print(letras[i], end="")
C B
A continuación se ejecutan por segunda vez las instrucciones del bloque.
En este caso el bloque consta de una sola instrucción que imprime el valor de letras[ i], es decir, letras[1], es decir, "B".
Recorrer una lista al revés - Paso 6
letras = ["A", "B", "C"]
for i in range(len(letras)-1, -1, -1):
print(letras[i], end=" ")
C B
A continuación la variable de control toma el tercer y último valor de range(len(letras)-1, -1, -1), es decir, de [2, 1, 0].
En este caso, la variable de control es i y toma el valor 0.
Recorrer una lista al revés - Paso 7
letras = ["A", "B", "C"]
for i in range(len(letras)-1, -1, -1):
print(letras[i], end="")
C B A
A continuación se ejecutan por tercera y última vez las instrucciones del bloque.
En este caso el bloque consta de una sola instrucción que imprime el valor de letras[ i], es decir, letras[0], es decir, "A".
Recorrer y modificar una lista
letras = ["A", "B", "C"]
print(letras)
for i in range(len(letras)):
letras[i] = "X"
print(letras)
['A', 'B', 'C'] ['X', 'B', 'C'] ['X', 'X', 'C'] ['X', 'X', 'X']
Puede ver la ejecución paso a paso de este programa utilizando los iconos de avance y retroceso situados abajo a la derecha.
Recorrer y modificar una lista - Paso 1
letras = ["A", "B", "C"]
print(letras)
for i in range(len(letras)):
letras[i] = "X"
print(letras)
Se ejecuta la primera instrucción del programa.
En este caso, define la lista letras.
Recorrer y modificar una lista - Paso 2
letras = ["A", "B", "C"]
print(letras)
for i in range(len(letras)):
letras[i] = "X"
print(letras)
['A', 'B', 'C']
A continuación escribe la lista letras que se acaba de definir.
Recorrer y modificar una lista - Paso 3
letras = ["A", "B", "C"]
print(letras)
for i in range(len(letras)):
letras[i] = "X"
print(letras)
['A', 'B', 'C']
A continuación se ejecuta el bucle. La variable de control toma el primer valor de range(len(letras)). Como la lista letras tiene 3 elementos, len(letras) devuelve el valor 3 y range(len(letras)) devuelve range(3), es decir [0, 1, 2]. Es decir, que la variable de control va a tomar valores de [0, 1, 2]
En este caso, la variable de control es i y toma el valor 0.
Recorrer y modificar una lista - Paso 4
letras = ["A", "B", "C"]
print(letras)
for i in range(len(letras)):
letras[i] = "X"
print(letras)
['A', 'B', 'C']
A continuación se ejecutan las instrucciones del bloque.
En este caso la primera instrucción del bloque modifica el valor de letras[ i], es decir, de letras[0].
Recorrer y modificar una lista - Paso 5
letras = ["A", "B", "C"]
print(letras)
for i in range(len(letras)):
letras[i] = "X"
print(letras)
['A', 'B', 'C']
['X', 'B', 'C']
A continuación se ejecuta la segunda instrucción del bloque.
Esta instrucción escribe la lista letras, cuyo primer término ya no es "A", sino "X".
Recorrer y modificar una lista - Paso 6
letras = ["A", "B", "C"]
print(letras)
for i in range(len(letras)):
letras[i] = "X"
print(letras)
['A', 'B', 'C'] ['X', 'B', 'C']
A continuación la variable de control toma el segundo valor de range(len(letras)), es decir, de [0, 1, 2].
En este caso, la variable de control es i y toma el valor "1".
Recorrer y modificar una lista - Paso 7
letras = ["A", "B", "C"]
print(letras)
for i in range(len(letras)):
letras[i] = "X"
print(letras)
['A', 'B', 'C'] ['X', 'B', 'C']
A continuación se ejecutan por segunda vez las instrucciones del bloque.
En este caso la primera instrucción del bloque modifica el valor de letras[i], es decir, de letras[1].
Recorrer y modificar una lista - Paso 8
letras = ["A", "B", "C"]
print(letras)
for i in range(len(letras)):
letras[i] = "X"
print(letras)
['A', 'B', 'C']
['X', 'B', 'C']
['X', 'X', 'C']
A continuación se ejecuta la segunda instrucción del bloque.
Esta instrucción escribe la lista letras, cuyo segundo término ya no es "B", sino "X".
Recorrer y modificar una lista - Paso 9
letras = ["A", "B", "C"]
print(letras)
for i in range(len(letras)):
letras[i] = "X"
print(letras)
['A', 'B', 'C'] ['X', 'B', 'C'] ['X', 'X', 'C']
A continuación la variable de control toma el tercer y último valor de range(len(letras)), es decir, de [0, 1, 2].
En este caso, la variable de control es i y toma el valor "2".
Recorrer y modificar una lista - Paso 10
letras = ["A", "B", "C"]
print(letras)
for i in range(len(letras)):
letras[i] = "X"
print(letras)
['A', 'B', 'C'] ['X', 'B', 'C'] ['X', 'X', 'C']
A continuación se ejecuta la segunda instrucción del bloque.
Esta instrucción escribe la lista letras, cuyo tercer término ya no es "C", sino "X".
Recorrer y modificar una lista - Paso 11
letras = ["A", "B", "C"]
print(letras)
for i in range(len(letras)):
letras[i] = "X"
print(letras)
['A', 'B', 'C']
['X', 'B', 'C']
['X', 'X', 'C']
['X', 'X', 'X']
A continuación la variable de control toma el tercer y último valor de range(len(letras)), es decir, de [0, 1, 2].
En este caso, la variable de control es i y toma el valor "2".
Para eliminar los elementos de una lista necesitamos recorrer la lista al revés. Si recorremos la lista de principio a fin, al eliminar un valor de la lista, la lista se acorta y cuando intentamos acceder a los últimos valores se produce un error de índice fuera de rango, como muestra el siguiente ejemplo en el que se eliminan los valores de una lista que valen "B":
Eliminar valores de una lista (incorrecto)
letras = ["A", "B", "C"]
print(letras)
for i in range(len(letras)):
if letras[i] == "B":
del letras[i]
print(letras)
['A', 'B', 'C']
['A', 'B', 'C']
['A', 'C']
Traceback (most recent call last):
File "ejemplo.py", line 4, in <module>
if letras[i] == "B":
IndexError: list index out of range
Puede ver la ejecución paso a paso de este programa utilizando los iconos de avance y retroceso situados abajo a la derecha.
Eliminar valores de una lista (incorrecto) - Paso 1
letras = ["A", "B", "C"]
print(letras)
for i in range(len(letras)):
if letras[i] == "B":
del letras[i]
print(letras)
Se ejecuta la primera instrucción del programa.
En este caso, define la lista letras.
Eliminar valores de una lista (incorrecto) - Paso 2
letras = ["A", "B", "C"]
print(letras)
for i in range(len(letras)):
if letras[i] == "B":
del letras[i]
print(letras)
['A', 'B', 'C']
A continuación escribe la lista letras que se acaba de definir.
Eliminar valores de una lista (incorrecto) - Paso 3
letras = ["A", "B", "C"]
print(letras)
for i in range(len(letras)):
if letras[i] == "B":
del letras[i]
print(letras)
['A', 'B', 'C']
A continuación se ejecuta el bucle. La variable de control toma el primer valor de range(len(letras)). Como la lista letras tiene 3 elementos, len(letras) devuelve el valor 3 y range(len(letras)) devuelve range(3), es decir [0, 1, 2]. Es decir, que la variable de control va a tomar valores de [0, 1, 2]
En este caso, la variable de control es i y toma el valor 0.
Eliminar valores de una lista (incorrecto) - Paso 4
letras = ["A", "B", "C"]
print(letras)
for i in range(len(letras)):
if letras[i] == "B":
del letras[i]
print(letras)
['A', 'B', 'C']
A continuación se ejecutan las instrucciones del bloque.
En este caso la primera instrucción del bloque comprueba si letras[ i], es decir, letras[0] es igual a "B". Como no lo es, no ejecuta el cuerpo de la condición.
Eliminar valores de una lista (incorrecto) - Paso 5
letras = ["A", "B", "C"]
print(letras)
for i in range(len(letras)):
if letras[i] == "B":
del letras[i]
print(letras)
['A', 'B', 'C']
['A', 'B', 'C']
A continuación se ejecuta la segunda instrucción del bloque.
Esta instrucción escribe la lista letras, que no se ha modificado.
Eliminar valores de una lista (incorrecto) - Paso 6
letras = ["A", "B", "C"]
print(letras)
for i in range(len(letras)):
if letras[i] == "B":
del letras[i]
print(letras)
['A', 'B', 'C'] ['A', 'B', 'C']
A continuación la variable de control toma el segundo valor de range(len(letras)), es decir, de [0, 1, 2].
En este caso, la variable de control es i y toma el valor 1.
Eliminar valores de una lista (incorrecto) - Paso 7
letras = ["A", "B", "C"]
print(letras)
for i in range(len(letras)):
if letras[i] == "B":
del letras[i]
print(letras)
['A', 'B', 'C'] ['A', 'B', 'C']
A continuación se ejecutan por segunda vez las instrucciones del bloque.
En este caso la primera instrucción del bloque comprueba si letras[ i], es decir, letras[1] es igual a "B". Como sí lo es, se ejecuta el cuerpo de la condición.
Eliminar valores de una lista (incorrecto) - Paso 8
letras = ["A", "B", "C"]
print(letras)
for i in range(len(letras)):
if letras[i] == "B":
del letras[i]
print(letras)
['A', 'B', 'C'] ['A', 'B', 'C']
A continuación se ejecutan las instrucciones del cuerpo de la condición.
En este caso el cuerpo consta de una sola instrucción que elimina el elemento letras[ i], es decir, letras[1].
Eliminar valores de una lista (incorrecto) - Paso 9
letras = ["A", "B", "C"]
print(letras)
for i in range(len(letras)):
if letras[i] == "B":
del letras[i]
print(letras)
['A', 'B', 'C']
['A', 'B', 'C']
['A', 'C']
A continuación se ejecuta la segunda instrucción del bloque.
Esta instrucción escribe la lista letras, que ha perdido el elemento "B".
Eliminar valores de una lista (incorrecto) - Paso 10
letras = ["A", "B", "C"]
print(letras)
for i in range(len(letras)):
if letras[i] == "B":
del letras[i]
print(letras)
['A', 'B', 'C'] ['A', 'B', 'C'] ['A', 'C']
A continuación la variable de control toma el tercer y último valor de range(len(letras)), es decir, de [0, 1, 2]. Es importante señalar que range(len(letras)) no se evalúa en cada iteración, sino que se evalúa en la primera iteración y se recorre en las siguientes.
En este caso, la variable de control es i y toma el valor 2.
Eliminar valores de una lista (incorrecto) - Paso 11
letras = ["A", "B", "C"]
print(letras)
for i in range(len(letras)):
if letras[i] == "B":
del letras[i]
print(letras)
['A', 'B', 'C']
['A', 'B', 'C']
['A', 'C']
Traceback (most recent call last):
File "ejemplo.py", line 4, in <module>
if letras[i] == "B":
IndexError: list index out of range
A continuación se ejecutan por tercera vez las instrucciones del bloque.
En este caso la primera instrucción del bloque comprueba si letras[ i], es decir, letras[2] es igual a "B". Como letras[2] no existe (porque la lista tiene ahora sólo dos elementos), se produce un error y el programa se interrumpe.
La solución es recorrer la lista en orden inverso, de manera que aunque se eliminen elementos y la lista se acorte, los valores que todavía no se han recorrido siguen existiendo en la misma posición que al principio.
Eliminar valores de una lista (correcto)
letras = ["A", "B", "C"]
print(letras)
for i in range(len(letras)-1, -1, -1):
if letras[i] == "B":
del letras[i]
print(letras)
['A', 'B', 'C'] ['A', 'B', 'C'] ['A', 'C'] ['A', 'C']
Puede ver la ejecución paso a paso de este programa utilizando los iconos de avance y retroceso situados abajo a la derecha.
Eliminar valores de una lista (correcto) - Paso 1
letras = ["A", "B", "C"]
print(letras)
for i in range(len(letras)-1, -1, -1):
if letras[i] == "B":
del letras[i]
print(letras)
Se ejecuta la primera instrucción del programa.
En este caso, define la lista letras.
Eliminar valores de una lista (correcto) - Paso 2
letras = ["A", "B", "C"]
print(letras)
for i in range(len(letras)-1, -1, -1):
if letras[i] == "B":
del letras[i]
print(letras)
['A', 'B', 'C']
A continuación escribe la lista letras que se acaba de definir.
Eliminar valores de una lista (correcto) - Paso 3
letras = ["A", "B", "C"]
print(letras)
for i in range(len(letras)-1, -1, -1):
if letras[i] == "B":
del letras[i]
print(letras)
['A', 'B', 'C']
A continuación se ejecuta el bucle. La variable de control toma el primer valor de range(len(letras)). Como la lista letras tiene 3 elementos, len(letras)-1 devuelve el valor 2 y range(len(letras)-1, -1, -1) devuelve range(2, -1, -1), es decir [2, 1, 0]. Es decir, que la variable de control va a tomar valores de [2, 1, 0]
En este caso, la variable de control es i y toma el valor 2.
Eliminar valores de una lista (correcto) - Paso 4
letras = ["A", "B", "C"]
print(letras)
for i in range(len(letras)-1, -1, -1):
if letras[i] == "B":
del letras[i]
print(letras)
['A', 'B', 'C']
A continuación se ejecutan las instrucciones del bloque.
En este caso la primera instrucción del bloque comprueba si letras[ i], es decir, letras[2] es igual a "B". Como no lo es no ejecuta el cuerpo de la condición.
Eliminar valores de una lista (correcto) - Paso 5
letras = ["A", "B", "C"]
print(letras)
for i in range(len(letras)-1, -1, -1):
if letras[i] == "B":
del letras[i]
print(letras)
['A', 'B', 'C']
['A', 'B', 'C']
A continuación se ejecuta la segunda instrucción del bloque.
Esta instrucción escribe la lista letras, que no se ha modificado.
Eliminar valores de una lista (correcto) - Paso 6
letras = ["A", "B", "C"]
print(letras)
for i in range(len(letras)-1, -1, -1):
if letras[i] == "B":
del letras[i]
print(letras)
['A', 'B', 'C'] ['A', 'B', 'C']
A continuación la variable de control toma el segundo valor de range(len(letras)-1, -1, -1), es decir, de [2, 1, 0].
En este caso, la variable de control es i y toma el valor 1.
Eliminar valores de una lista (correcto) - Paso 7
letras = ["A", "B", "C"]
print(letras)
for i in range(len(letras)-1, -1, -1):
if letras[i] == "B":
del letras[i]
print(letras)
['A', 'B', 'C'] ['A', 'B', 'C']
A continuación se ejecutan por segunda vez las instrucciones del bloque.
En este caso la primera instrucción del bloque comprueba si letras[ i], es decir, letras[1] es igual a "B". Como sí lo es, se ejecuta el cuerpo de la condición.
Eliminar valores de una lista (correcto) - Paso 8
letras = ["A", "B", "C"]
print(letras)
for i in range(len(letras)-1, -1, -1):
if letras[i] == "B":
del letras[i]
print(letras)
['A', 'B', 'C'] ['A', 'B', 'C']
A continuación se ejecutan las instrucciones del cuerpo de la condición.
En este caso el cuerpo consta de una sola instrucción que elimina el elemento letras[ i], es decir, letras[1].
Eliminar valores de una lista (correcto) - Paso 9
letras = ["A", "B", "C"]
print(letras)
for i in range(len(letras)-1, -1, -1):
if letras[i] == "B":
del letras[i]
print(letras)
['A', 'B', 'C']
['A', 'B', 'C']
['A', 'C']
A continuación se ejecuta la segunda instrucción del bloque.
Esta instrucción escribe la lista letras, que ha perdido el elemento "B".
Eliminar valores de una lista (correcto) - Paso 10
letras = ["A", "B", "C"]
print(letras)
for i in range(len(letras)-1, -1, -1):
if letras[i] == "B":
del letras[i]
print(letras)
['A', 'B', 'C'] ['A', 'B', 'C'] ['A', 'C']
A continuación la variable de control toma el tercer y último valor de range(len(letras)-1, -1, -1), es decir, de [2, 1, 0]. Es importante señalar que range(len(letras)) no se evalúa en cada iteración, sino que se evalúa en la primera iteración y se recorre en las siguientes.
En este caso, la variable de control es i y toma el valor 0.
Eliminar valores de una lista (correcto) - Paso 11
letras = ["A", "B", "C"]
print(letras)
for i in range(len(letras)-1, -1, -1):
if letras[i] == "B":
del letras[i]
print(letras)
['A', 'B', 'C'] ['A', 'B', 'C'] ['A', 'C']
A continuación se ejecutan por segunda vez las instrucciones del bloque.
En este caso la primera instrucción del bloque comprueba si letras[ i], es decir, letras[0] es igual a "B". Como no lo es, no se ejecuta el cuerpo de la condición.
Eliminar valores de una lista (correcto) - Paso 12
letras = ["A", "B", "C"]
print(letras)
for i in range(len(letras)-1, -1, -1):
if letras[i] == "B":
del letras[i]
print(letras)
['A', 'B', 'C']
['A', 'B', 'C']
['A', 'C']
['A', 'C']
A continuación se ejecuta la segunda instrucción del bloque.
Esta instrucción escribe la lista letras, que ha perdido el elemento "B".
Para saber si un valor está en una lista se puede utilizar el operador in. La sintaxis sería "elemento in lista" y devuelve un valor lógico: True si el elemento está en la lista, False si el elemento no está en la lista.
Por ejemplo, el programa siguiente comprueba si el usuario es una persona autorizada:
personas_autorizadas = ["Alberto", "Carmen"]
nombre = input("Dígame su nombre: ")
if nombre in personas_autorizadas:
print("Está autorizado")
else:
print("No está autorizado")
Para saber si un valor no está en una lista se pueden utilizar los operadores not in. La sintaxis sería "elemento not in lista" y devuelve un valor lógico: True si el elemento no está en la lista, False si el elemento está en la lista.
Por ejemplo, el programa siguiente comprueba si el usuario es una persona autorizada:
personas_autorizadas = ["Alberto", "Carmen"]
nombre = input("Dígame su nombre: ")
if nombre not in personas_autorizadas:
print("No está autorizado")
else:
print("Está autorizado")